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)。
答案 0 :(得分:53)
所有操作都保留订单,但明确不这样做的操作除外。订购始终是“有意义的”#34;而不仅仅是在sortBy
之后。例如,如果您读取文件(sc.textFile
),则RDD的行将按它们在文件中的顺序排列。
如果不尝试提供完整列表,map
,filter
,flatMap
和coalesce
(shuffle=false
)会保留订单。 sortBy
,partitionBy
,join
不保留订单。
原因是大多数RDD操作都在分区内的Iterator
上运行。因此map
或filter
无法搞砸订单。您可以查看code以便自己查看。
您现在可能会问:如果我的RDD带有HashPartitioner
怎么办?当我使用map
更改密钥时会发生什么?好吧,它们将保持原位,现在RDD没有被密钥分区。您可以使用partitionBy
通过随机播放来恢复分区。
答案 1 :(得分:2)
在Spark 2.0.0+中,coalesce
不保证合并期间的分区顺序。 DefaultPartitionCoalescer具有基于分区局部性的优化算法。当分区包含有关其位置的信息时,DefaultPartitionCoalescer
尝试合并同一主机上的分区。而且,只有在没有位置信息时,它才会根据索引自动分割分区并保留分区顺序。