pyspark:按值将单个RDD拆分为多个RDD

时间:2017-12-03 00:56:04

标签: apache-spark pyspark rdd

我找不到答案。 如果我有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])

但如果RDD很大,那么collect()将非常耗时。我们必须按比例思考。有没有分布式的方法呢? (比如使用lambda function ..等等)谢谢!

1 个答案:

答案 0 :(得分:2)

这是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会将此操作映射到每个键值对并展平结果。