2016-12-28 5 views
0

Мне нужно выполнить следующую операцию: выбирая каждое поле в rdd. я должен преобразовать его в Scala, EXPECIALLY часть в третьей строке, выбирая каждый столбец:Выбор колонки RDD scala-spark

val rddHash=x.map(row =>(DigestUtils.sha1Hex(row(0).toString.getBytes("UTF-8")),row(1).toString)).reduceByKey((a,b)=>(a+b)) 
val z=rddHash.cartesian(rddHash) 
val outRdd=z.map(m => (m(0)(0),(m(1)(0),euclidean(m(0)(1).split(','),m(1)(1).split(','))))) 

Х представляет собой набор данных, как заряжена (String, Object).

Но этот код не работает, проблема связана с третьей строкой, в которой я пытаюсь выбрать элементы через m (0) (0), m (1) (0) и так далее. Ошибка:

<console>:42: error: ((String, String), (String, String)) does not take parameters 

Как я могу выбрать каждое поле в РДУ в Scala?

Ps мой код строки в pyspark заключается в следующем:

outRdd=cartesian.map(lambda m: (m[0][0],(m[1][0],euclidean(m[0][1].split(','),m[1][1].split(','))))) 

Где декартовой имеют тот же struucture показал раньше:

((String, String), (String, String)) 

ответ

1

Вы не можете напрямую позвонить m(index) кортежей в Скале.

Вы можете либо поля доступа с помощью _1 или с помощью сопоставления с образцом, который, как правило, более удобным для чтения:

val outRdd = z.map(m => (m._1._1, (m._2._1, ...)) 

Или:

val outRdd = z.map { case ((hex1, obj1), (hex2, obj2)) => 
    (hex1, (hex2, ...)) 
} 
Смежные вопросы