【问题标题】:Reduce operation on Spark减少对 Spark 的操作
【发布时间】:2017-03-21 11:08:42
【问题描述】:

我试图用 3 个值减少一个 RDD,所以,首先,我用以下格式映射 rdd

a = mytable.rdd.map(lambda w: (w.id,(w.v1,w.v2,w.v3)))

然后在下一步我用下面的代码减少它

b = a.reduceByKey(lambda a,b,c: (a[0] +','+ a[1],b[0] +','+ b[1],c[0] +','+ c[1]))

但是,我收到一个错误: TypeError: () 正好需要 3 个参数(给定 2 个)

我的目标是添加该 rdd 的所有值,例如,如果我的 rdd 具有这些值:

[(id1, ('a','b','c')),(id1', ('e','f','g'))]

reduce 之后,我希望结果按以下顺序排列:

[(id1, ('a,d','b,e','c,f'))]

谢谢

【问题讨论】:

    标签: python apache-spark pyspark reduce


    【解决方案1】:

    最优解可以表示为:

    a.groupByKey().mapValues(lambda vs: [",".join(v) for v in  zip(*vs)])
    

    初始groupByKey 将数据分组到一个结构中,相当于:

    ('id1', [('a','b','c'), ('e','f','g')])
    

    zip(*vs) 将值转置为:

    [('a', 'e'), ('b', 'f'), ('c', 'g')]
    

    join 的理解连接每个元组。

    reduceByKey 在这里确实不是正确的选择(考虑复杂性),但通常它需要两个参数的函数,所以lambda a, b, c: ... 不会这样做。我相信你想要这样的东西:

    lambda a, b: (a[0] + "," + b[0], a[1] + "," + b[1], a[2] + "," + b[2])
    

    【讨论】:

      猜你喜欢
      • 2016-02-07
      • 2017-09-06
      • 1970-01-01
      • 2018-09-14
      • 2023-03-08
      • 2021-06-08
      • 2017-04-05
      • 1970-01-01
      • 2022-11-23
      相关资源
      最近更新 更多