2015-09-21 2 views
0

У меня есть данные в виде РДУ [Список [Double], список [Double]], например:Scala Spark - используя RDD с mllib

sampleData = 
    (
     ((1.1, 1.2, 1.3), (1.1, 1.5, 1.2)), 
     ((3.0, 3.3, 3.3), (3.1, 3.2, 3.6)) 
    ) 

Я хотел бы назвать Statistics.corr (а , b) где a - из первого списка [Double], а b - из второго списка [Double]

Результат, который мне нужен, - это 2 значения корреляции от функции corr() для (1.1, 1.2, 1.3) , (1.1, 1.5, 1.2) и (3.0, 3.3, 3.3), (3.1, 3.2, 3.6)

Мой попытка:

Statistics.corr(sampleData.flatMap(_._1), sampleData.flatMap(_._2)) 

Это дает мне одну корреляцию для (1.1, 1.2, 1.3, 3.0, 3.3, 3.3), (1.1, 1.5, 1.2, 3.1, 3.2, 3.6), которая не является то, что я хочу

ответ

0

Это требует карты, а не карты, поскольку вы хотите, чтобы строки RDD были разделены.

К сожалению, я еще не знаю сериализуемую функцию корреляции, которая будет работать с двумя List [Double] s. Первое, что я проверил, было Pearson correlation from Apache Commons, но это не сериализуемо. Возможно, вам придется написать свою собственную функцию (но я бы потратил больше усилий, глядя в первую очередь). После того как вы корреляционная функция, вы будете использовать его как следует:

sampleData.map(x => correlation(x._1,x._2)) 

Это все равно будет РДД, и это не будет иметь никакого отношения к исходной строке она пришла к тому же порядку, так что вы можете передавать исходные данные (или, по крайней мере, какой бы идентификатор он ни имел).