【问题标题】:pyspark: split a single RDD to multiple RDD by valuepyspark:将单个 RDD 按值拆分为多个 RDD
【发布时间】:2017-12-03 00:56:03
【问题描述】:

我找不到答案。 如果我有 RDD

rdd = sc.parallelize([('a', [1,2,3]), ('b',[4,5,6])])

其中每个值都是一个列表。 有没有办法拆分RDD,使得它变成

sc.parallelize([('a',1),('a',2),('a',3),('b',4),('b',5),('b'6)])

现在每个值都是列表的元素之一,并且匹配键。 我大致知道解决方案。我们可以先collect()

a = rdd.collect()

然后重新分配一个RDD为

rdd2 = sc.parallelize([x for x in a])

但如果 R​​DD 很大,collect() 将非常耗时。我们必须从规模上考虑。有没有分布式的方法来做到这一点? (比如使用lambda function .. 等)谢谢!

【问题讨论】:

    标签: apache-spark pyspark rdd


    【解决方案1】:

    这是flatMap的任务:

    rdd.flatMap(lambda x: [(x[0], v) for v in x[1]]).collect()
    # [('a', 1), ('a', 2), ('a', 3), ('b', 4), ('b', 5), ('b', 6)]
    

    这里的 lambda 函数从原始 rdd 中获取一个键值对,并将该键映射到每个单独的值:

    lamb = lambda x: [(x[0], v) for v in x[1]]
    
    lamb(('a', [1,2,3]))
    # [('a', 1), ('a', 2), ('a', 3)]
    

    flatMap 会将此操作映射到每个键值对并展平结果。

    【讨论】:

    • 谢谢!这正是我所需要的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多