哪些操作保留了RDD顺序?

时间:2015-03-26 16:39:24

标签: apache-spark rdd

RDD具有有意义的(与存储模型强加的某些随机顺序相反),如果它由sortBy()处理,则按此reply中的说明。< / p>

现在,哪些操作保留该订单?

,是 保证 a.sortBy()之后)

a.map(f).zip(a) === 
a.map(x => (f(x),x))

怎么样

a.filter(f).map(g) === 
a.map(x => (x,g(x))).filter(f(_._1)).map(_._2)

怎么样

a.filter(f).flatMap(g) === 
a.flatMap(x => g(x).map((x,_))).filter(f(_._1)).map(_._2)

这里“平等”===被理解为“功能等同”,即无法使用用户级操作区分结果(即,不读取日志和c)。

2 个答案:

答案 0 :(得分:53)

所有操作都保留订单,但明确不这样做的操作除外。订购始终是“有意义的”#34;而不仅仅是在sortBy之后。例如,如果您读取文件(sc.textFile),则RDD的行将按它们在文件中的顺序排列。

如果不尝试提供完整列表,mapfilterflatMapcoalesceshuffle=false)会保留订单。 sortBypartitionByjoin不保留订单。

原因是大多数RDD操作都在分区内的Iterator上运行。因此mapfilter无法搞砸订单。您可以查看code以便自己查看。

您现在可能会问:如果我的RDD带有HashPartitioner怎么办?当我使用map更改密钥时会发生什么?好吧,它们将保持原位,现在RDD没有被密钥分区。您可以使用partitionBy通过随机播放来恢复分区。

答案 1 :(得分:2)

在Spark 2.0.0+中,coalesce不保证合并期间的分区顺序。 DefaultPartitionCoalescer具有基于分区局部性的优化算法。当分区包含有关其位置的信息时,DefaultPartitionCoalescer尝试合并同一主机上的分区。而且,只有在没有位置信息时,它才会根据索引自动分割分区并保留分区顺序。