哪些操作保留RDD订单?

RDD有一个有意义的 (与存储模型施加的一些随机顺序相反),如果它是由sortBy()处理的,如本答复所述 。

现在,哪些操作保持这个顺序?

例如,它保证 (在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) 

在这里,“平等” ===被理解为“function等同”,即无法通过用户级别的操作(即不读取日志&c)区分结果。

所有的操作保持顺序,除了那些明确没有的。 sorting总是“有意义的”,而不仅仅是在sortBy 。 例如,如果读取文件( sc.textFile ),则RDD的行将按照它们在文件中的顺序排列。

不要试图给出完整的列表, mapfilterflatMapcoalesce (使用shuffle=false )会保持顺序。 sortBypartitionByjoin不保存顺序。

原因是大多数RDD操作在分区内的Iterator工作。 所以mapfilter只是没有办法搞乱顺序。 你可以看看代码来看看你自己。

你现在可能会问:如果我有一个HashPartitioner的RDD会怎样? 当我使用map来更改密钥时会发生什么? 那么,他们会留在原地,现在RDD没有被分配钥匙。 您可以使用partitionBy通过shuffle来恢复分区。