我需要执行以下操作:选择rdd中的每个字段。 我必须在Scala中转换它,特别是第三行中的部分,选择每一列:
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是收费为(String,Object)的数据集。
但是这段代码不起作用,问题是与第三行相关的部分,我尝试通过m(0)(0),m(1)(0)等来选择元素。 错误是:
<console>:42: error: ((String, String), (String, String)) does not take parameters
如何在Scala中的rdd中选择每个字段?
我在pyspark中的代码行是以下代码:
outRdd=cartesian.map(lambda m: (m[0][0],(m[1][0],euclidean(m[0][1].split(','),m[1][1].split(',')))))
笛卡儿在此之前有相同的结构:
((String, String), (String, String))
答案 0 :(得分:1)
您无法直接在scala上的元组上调用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, ... ))
}