【问题标题】:Selecting column RDD scala-spark选择列 RDD scala-spark
【发布时间】:2016-12-28 18:50:41
【问题描述】:

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

【问题讨论】:

    标签: scala apache-spark error-handling rdd


    【解决方案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, ... ))
    } 
    

    【讨论】:

      猜你喜欢
      • 2015-10-31
      • 1970-01-01
      • 2014-10-26
      • 2021-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-16
      • 1970-01-01
      相关资源
      最近更新 更多