哪些操作保留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的行将按照它们在文件中的顺序排列。
不要试图给出完整的列表, map
, filter
, flatMap
和coalesce
(使用shuffle=false
)会保持顺序。 sortBy
, partitionBy
, join
不保存顺序。
原因是大多数RDD操作在分区内的Iterator
工作。 所以map
或filter
只是没有办法搞乱顺序。 你可以看看代码来看看你自己。
你现在可能会问:如果我有一个HashPartitioner
的RDD会怎样? 当我使用map
来更改密钥时会发生什么? 那么,他们会留在原地,现在RDD没有被分配钥匙。 您可以使用partitionBy
通过shuffle来恢复分区。