我要转换此RDD:
[(['1', '2', '3'], 'abc'), (['4', '5', '6'], 'xyz')]
此表单:
[('1', 'abc'), ('2', 'abc'), ('3', 'abc'), ('4', 'xyz'), ('5', 'xyz'), ('6', 'xyz')]
如何通过PySpark中的RDD转换实现它?
答案 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')]