如何在PySpark中的成对RDD中使用转换?

时间:2019-04-30 23:20:15

标签: python apache-spark pyspark

我要转换此RDD:

[(['1', '2', '3'], 'abc'), (['4', '5', '6'], 'xyz')]

此表单:

[('1', 'abc'), ('2', 'abc'), ('3', 'abc'), ('4', 'xyz'), ('5', 'xyz'), ('6', 'xyz')]

如何通过PySpark中的RDD转换实现它?

2 个答案:

答案 0 :(得分:2)

由于我没有50rep来评论Rakesh的解决方案,因此我要发布自己的答案,该答案与Rakesh的答案非常相似,只是我们不需要在{{1 }},只需直接使用map。顾名思义,flatMap使结果变平,在此之前调用flatMap是不必要的。

flatMap

答案 1 :(得分:1)

您需要使用flatMap函数,对此也需要做一些理解。这是执行此操作的步骤-

使用提供的数据创建rdd-

rdd = sc.parallelize([(['1', '2', '3'], 'abc'), (['4', '5', '6'], 'xyz')])
rdd.collect()
[(['1', '2', '3'], 'abc'),
(['4', '5', '6'], 'xyz')] 

将每个子键的值映射为key,value对-

rdd.map(lambda x:[(i,x[1]) for i in x[0]],).collect()
[[('1', 'abc'), ('2', 'abc'), ('3', 'abc')],
 [('4', 'xyz'), ('5', 'xyz'), ('6', 'xyz')]]

最后,应用flatMap将其分为行数-

rdd.map(lambda x:[(i,x[1]) for i in x[0]],).flatMap(lambda x:x).collect()
[('1', 'abc'),
 ('2', 'abc'),
 ('3', 'abc'),
 ('4', 'xyz'),
 ('5', 'xyz'),
 ('6', 'xyz')]