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



我正在使用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 = ([键 1, 字符串14, 字符串 15, 字符串 12, 字符串

13, 字符串 11], [键 2, 字符串21, 字符串22, 字符串24, 字符串25, 字符串23], ...(

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

这里发生的事情是洗牌。随机播放期间的操作顺序是不确定的。在某些情况下,可以保留顺序,但不能保证,并且仅限于简单情况,例如本地模式。

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

最新更新