2016-12-28 143 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(','))))) 

X是帶電爲(字符串,Object)將數據集。

但是這段代碼不起作用,問題是與我試圖通過m(0)(0),m(1)(0)等選擇元素的第三行有關的部分。 錯誤是:

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

如何選擇在斯卡拉RDD每場?

詩在pyspark我的代碼行是以下之一:

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

當笛卡爾具有相同的struucture顯示之前:您不能直接調用m(index)在斯卡拉元組

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

回答

1

您可以使用_1或使用模式匹配,這通常是更可讀訪問字段:

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

或者:

val outRdd = z.map { case ((hex1, obj1), (hex2, obj2)) => 
    (hex1, (hex2, ...)) 
}