【问题标题】:Does Dataframe coalesce in Spark preserve order?Spark 中的 Dataframe 合并是否保持顺序?
【发布时间】:2020-09-29 18:45:33
【问题描述】:

我使用 coalesce(1) 将 Dataframe 写入单个文件,如下所示。

df.coalesce(1).write.format("csv")
  .option("header", true).mode("overwrite").save(output_path)

快速浏览文件显示订单已保留,但是否总是如此?如果订单没有保留,我该如何执行? RDD的coalesce函数有一个额外的参数来禁止shuffle,而Dataframe的coalesce方法只需要1个参数。

【问题讨论】:

  • 在合并后指定orderBy 以强制排序
  • 也许是大祭司给出答案的时候了。
  • 我认为这需要一些努力才能弄清楚,尽管已经再次讨论过stackoverflow.com/questions/29284095/…。看看 Avseiytsev Dmitriy 的回答。似乎目前无法保证最终 RDD 的订单保留。这是负责合并算法的类github.com/apache/spark/blob/…

标签: dataframe apache-spark rdd shuffle


【解决方案1】:

我不这么认为,因为你怎么知道合并“到”哪个节点会发生?

【讨论】:

    【解决方案2】:

    如果您读取文件 (sc.read.text),DataFrame/Dataset/RDD 的行将按照它们在文件中的顺序排列。

    list, map, filter,coalesce and flatMap 保留订单。 sortBy, partitionBy and join 不保留订单。

    原因是大多数DataFrame/Dataset/RDD 操作在分区内的迭代器上工作。所以 map 或 filter 根本没有办法弄乱顺序。

    如果您选择使用HashPartitioner 并在DataFrame/Dataset/RDD 上调用map 将更改密钥。在这种情况下,您可以使用partitionBy 通过随机播放恢复分区。

    【讨论】:

      猜你喜欢
      • 2018-03-31
      • 2017-01-23
      • 2023-01-04
      • 2018-12-28
      • 1970-01-01
      • 2021-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多