如果 RDD 由 sortBy()
处理,则它具有有意义的(与存储模型强加的某些随机顺序相反)顺序。 ,如本reply中所述.
现在,哪些操作保留该顺序?
例如,是否保证(在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)。
最佳答案
除了那些明确不保留顺序的操作外,所有操作都保留顺序。排序始终是“有意义的”,而不仅仅是在 sortBy
之后。例如,如果您读取文件 (sc.textFile
),RDD 的行将按照它们在文件中的顺序排列。
在不尝试提供完整列表的情况下,map
、filter
和 flatMap
确实保留了顺序。 sortBy
、partitionBy
、join
不保留顺序。
原因是大多数 RDD 操作都在分区内的迭代器上工作。所以 map
或 filter
根本无法打乱顺序。你可以看看code亲自看看。
您现在可能会问:如果我有一个带有 HashPartitioner
的 RDD 怎么办?当我使用 map
更改按键时会发生什么?好吧,它们将保留在原处,现在 RDD 不再由键分区。您可以使用 partitionBy
通过随机播放来恢复分区。
关于apache-spark - 哪些操作保留 RDD 顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29284095/