我正在使用PySpark并且遇到一些麻烦,如果RDD包含长字符串,为什么合并两个RDD会失败呢。
特别是,我有两个结构为
的RDDrdd1 =([key1,[string11,string12]],[key2,[string21,string22]],...)
rdd2 =([key1,[string13,string14,string15]],[key2,[string23,string24,string25]],...)
字符串可以变得很长(即,它们值几MB)。我的最终目标是使用内容
获得一个新的“合并和扁平”RDDrdd3 =([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
似乎保留了订单,但混合必须发生在groupByKey
和map
之间。我认为扁平似乎不是问题。但由于groupByKey
返回ResultIterable
,因此很难弄清楚细节。总结一下,我不知道这里到底发生了什么。任何人都可以给我一个提示吗?我目前正在一个本地测试客户端上运行Spark,其中包含一些工作人员,如果这很重要的话。
答案 0 :(得分:1)
这里发生的事是洗牌。随机播放期间的操作顺序是不确定的。在某些情况下,订单可以保留,但不能保证,并且仅限于简单的情况,如本地模式。
除非您在每次洗牌后保留额外的订单信息和度假村价值(非常昂贵),否则没有解决方法。