apache-spark - 哪些操作保留 RDD 顺序?

标签 apache-spark rdd

如果 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 的行将按照它们在文件中的顺序排列。

在不尝试提供完整列表的情况下,mapfilterflatMap 确实保留了顺序。 sortBypartitionByjoin 不保留顺序。

原因是大多数 RDD 操作都在分区内的迭代器上工作。所以 mapfilter 根本无法打乱顺序。你可以看看code亲自看看。

您现在可能会问:如果我有一个带有 HashPartitioner 的 RDD 怎么办?当我使用 map 更改按键时会发生什么?好吧,它们将保留在原处,现在 RDD 不再由键分区。您可以使用 partitionBy 通过随机播放来恢复分区。

关于apache-spark - 哪些操作保留 RDD 顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29284095/

相关文章:

java - NoClassDefFoundError : scala/Product$class

python - Azure Kusto Spark 在写入中重写 ingestion_time()

hadoop - 如何将数据和元数据从 Hive 传输到 RDBMS

hadoop - 将配置单元分区表加载到Spark Dataframe

apache-spark - 沿袭如何在 Apache Spark 的 RDD 中传递

apache-spark - 如何反转 RDD.takeOrdered() 的顺序?

python - 为什么我的PySpark程序会卡在中间如下

python - 作为 PySpark 的 reduceByKey 键的列表

hadoop - YARN可以抢占Spark驱动程序吗?

python - 使用 lambda、python 在 PySpark 中进行元组操作