用长字符串合并两个RDD会混淆值的顺序

2024-06-24 13:42:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用PySpark,并且很难弄清楚为什么合并两个rdd失败,如果rdd包含长字符串。你知道吗

特别是,我有两个RDD的结构

rdd1 = ([key1, [string11, string12]], [key2, [string21, string22]], ...)

rdd2 = ([key1, [string13, string14, string15]], [key2, [string23, string24, string25]], ...)

字符串可能变得很长(即,它们值几MB)。我的最终目标是得到一个新的“合并和扁平化”RDD

rdd3 = ([key1, string11, string12, string13, string14, string15], [key2, string21, string22, string23, string24, string25], ...)

为此,我使用Python命令

rdd3 = sparkContext.union([rdd1, rdd2]).groupByKey() \
       .mapValues(lambda x: list(x)).map(lambda x: [x[0]] + list(x[1][0]) + list(x[1][1]))

这似乎是一个简单的任务,实际上,如果字符串很小,这个命令工作得很好。然而,对于很长的字符串,结果RDD的顺序突然以一种看似随机的方式混合在一起,比如

rdd3 = ([key1, string14, string15, string12, string13, string11], [key2, string21, string22, string24, string25, string23], ...)

虽然union似乎保持了顺序,但混合必须发生在groupByKeymap之间。我认为扁平化似乎不是问题所在。但是由于groupByKey返回一个ResultIterable,很难弄清楚细节。总而言之,我不知道这里到底发生了什么。谁能给我一个提示吗?我目前正在一个本地测试客户机上运行Spark,如果有必要的话,还需要一些工作人员。你知道吗


Tags: 字符串key2key1rddrdd3string15string11string24
1条回答
网友
1楼 · 发布于 2024-06-24 13:42:11

这里发生的是洗牌。洗牌过程中的操作顺序是不确定的。在某些情况下,可以保持顺序,但不能保证,并且仅限于简单的情况,如局部模式。你知道吗

除非您在每次洗牌后保留额外的订单信息和度假胜地值(非常昂贵),否则没有解决方法。你知道吗

相关问题 更多 >