繁体   English   中英

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

[英]How to use transformations in pair-wise RDD in PySpark?

我想转换这个RDD:

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

到这种形式:

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

如何使用 PySpark 中的 RDD 转换实现它?

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

rdd = sc.parallelize([(['1', '2', '3'], 'abc'), (['4', '5', '6'], 'xyz')])
r = rdd.flatMap(lambda item: [(k, item[1]) for k in item[0]])
r.collect() # to show result

您需要使用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')]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM