【问题标题】:Associating two arrays in an RDD by index通过索引关联 RDD 中的两个数组
【发布时间】:2018-07-14 15:51:52
【问题描述】:

我有一个 RDD,每行包含两个数组 RDD[(Array[Int], Array[Double])]。对于每一行,两个数组的大小相似,均为n。但是,每一行的大小不同,nn 最多可达 200。示例数据如下:

(Array(1, 3, 5), Array(1.0, 1.0, 2.0))
(Array(6, 3, 1, 9), Array(2.0, 1.0, 2.0, 1.0))
(Array(2, 4), Array(1.0, 3.0))
. . .

我想根据每行的索引在这两个数组之间进行组合。因此,预期的输出如下:

((1,1.0), (3,1.0), (5,2.0))
((6,2.0), (3,1.0), (1,2.0), (9,1.0))
((2,1.0), (4,3.0))

这是我的代码:

val data = spark.sparkContext.parallelize(Seq( (Array(1, 3, 5),Array(1.0, 1.0, 2.0)), (Array(6, 3, 1,9),Array(2.0, 1.0, 2.0, 1.0)) , (Array(2, 4),Array(1.0, 3.0)) ) )
val pairArr = data.map{x =>
  (x._1(0), x._2(0))
}
//pairArr: Array((1,1.0), (6,2.0), (2,1.0))

此代码仅获取每行中第一个索引的值。
谁能给我指导如何获得预期的输出?

谢谢。

【问题讨论】:

    标签: arrays scala apache-spark rdd


    【解决方案1】:

    你需要zip每个元组中的两个元素:

    data.map(x => x._1.zip(x._2)).collect
    // res1: Array[Array[(Int, Double)]] = Array(Array((1,1.0), (3,1.0), (5,2.0)), Array((6,2.0), (3,1.0), (1,2.0), (9,1.0)), Array((2,1.0), (4,3.0)))
    

    或者使用模式匹配:

    data.map{ case (x, y) => x.zip(y) }.collect
    // res0: Array[Array[(Int, Double)]] = Array(Array((1,1.0), (3,1.0), (5,2.0)), Array((6,2.0), (3,1.0), (1,2.0), (9,1.0)), Array((2,1.0), (4,3.0)))
    

    【讨论】:

      猜你喜欢
      • 2013-10-10
      • 1970-01-01
      • 2020-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多