首页 文章

选择列 RDD scala-spark

提问于
浏览
0

我需要执行以下操作:在 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 中选择每个字段?

ps 我在 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 回答

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

相关问题