选择列RDD scala-spark

时间:2016-12-28 18:50:42

标签: scala apache-spark error-handling rdd

我需要执行以下操作:选择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))

1 个答案:

答案 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, ... ))
}