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

时间:2017-08-03 07:28:24

标签: python apache-spark merge pyspark 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 =([key1,string14,string15,string12,string13,string11],[key2,string21,string22,string24,string25,string23],...)

虽然union似乎保留了订单,但混合必须发生在groupByKeymap之间。我认为扁平似乎不是问题。但由于groupByKey返回ResultIterable,因此很难弄清楚细节。总结一下,我不知道这里到底发生了什么。任何人都可以给我一个提示吗?我目前正在一个本地测试客户端上运行Spark,其中包含一些工作人员,如果这很重要的话。

1 个答案:

答案 0 :(得分:1)

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

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