【问题标题】:How to Sum a part of a list in RDD如何在 RDD 中对列表的一部分求和
【发布时间】:2017-12-23 02:40:17
【问题描述】:

我有一个 RDD,我想总结列表的一部分。

(key, element2 + element3)
(1, List(2.0, 3.0, 4.0, 5.0)), (2, List(1.0, -1.0, -2.0, -3.0))

输出应该是这样的,

(1, 7.0), (2, -3.0)

谢谢

【问题讨论】:

    标签: scala apache-spark rdd scala-2.10


    【解决方案1】:

    您可以map并在第二部分进行索引:

    yourRddOfTuples.map(tuple => {val list = tuple._2; list(1) + list(2)})
    

    您的评论后更新,将其转换为Vector

    yourRddOfTuples.map(tuple => {val vs = tuple._2.toVector; vs(1) + vs(2)})
    

    或者如果您不想使用转换:

    yourRddOfTuples.map(_._2.drop(1).take(2).sum)
    

    这会从元组的第二个元素 (.map(_._2) 中跳过第一个元素 (.drop(1)),取接下来的两个 (.take(2))(如果你有更少,可能会更少)并将它们相加(@987654329 @)。

    【讨论】:

    • 出现错误“Iterable[Double]不带参数”
    • 列表(1)+列表(2)
    • 在这种情况下,我怀疑您在第二个参数中有 List,但转换为 Vector 应该可以解决该问题。
    【解决方案2】:

    您可以通过mapkey-list 对来获取第 2 和第 3 个列表元素,如下所示:

    val rdd = sc.parallelize(Seq(
      (1, List(2.0, 3.0, 4.0, 5.0)),
      (2, List(1.0, -1.0, -2.0, -3.0))
    ))
    
    rdd.map{ case (k, l) => (k, l(1) + l(2)) }.collect
    // res1: Array[(Int, Double)] = Array((1,7.0), (2,-3.0))
    

    【讨论】:

    • 出现错误“Iterable[Double]不带参数”
    • 列表来自.zip(Stream).map
    • @ken,如果您有 Iterable[Double] 的集合而不是示例数据中的列表,您可以先执行 toList 将其转换为列表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    相关资源
    最近更新 更多