【问题标题】:Writing RDD partitions to individual parquet files without shuffling将 RDD 分区写入单个 parquet 文件而不进行改组
【发布时间】:2021-11-03 08:03:25
【问题描述】:

我有一个包含 20 个分区的 spark 数据框 df,每个分区都有一天的数据。这就是说我的输入数据框已经按天进行了分区。我的目标是编写一个按天分区的镶木地板文件。如果我尝试以下命令:

df.repartition(5).write.mode("overwrite").partitionBy(['day']).parquet("path")

当我的输入数据帧已经分区时,发生了很多改组。请注意,此数据帧包含超过 10 亿行,并且由于洗牌而正在杀死我的执行程序。

有没有一种方法可以将每个分区按原样写入镶木地板文件而无需任何洗牌?

【问题讨论】:

  • 通过使用coalesce(5),你正在减少分区的数量,在你的情况下,你不需要使用coalesce,只需删除它并尝试
  • @hprakash 没有合并,每天的分区数量非常少。无论如何,即使没有合并,仍然会发生很多改组,因为 spark 不知道我的输入数据已经按天分区。

标签: apache-spark pyspark


【解决方案1】:

有没有一种方法可以将每个分区按原样写入镶木地板文件而无需任何洗牌

答案: 没有。 repartition 进行完全洗牌并创建新分区。 coalesce 避免了完全洗牌,但仍然必须洗牌数据以实现新分区(通过一些启发式方法来最小化洗牌)。

你能减少洗牌吗?是的。 为什么需要repartition(5)?看起来这里的一个低垂的果实只是将其移除,因为它会产生一个完整的洗牌。如果提供有关 df 的更多上下文,则可以在此处进行其他优化。

【讨论】:

  • 感谢@yosi 的回答。我尝试用 coalesce 替换它,但执行器仍然失败,因为他们做了很多随机写入。我这样做是为了避免每个分区下的小文件。数据框包含具有以下架构的事务数据: root |-- location: string (nullable = true) |-- product: string (nullable = true) |-- date: date (nullable = true)) |-- sales: integer (nullable = true) 它有 92 天的数据,每个日期已经在一个分区中。 df.rdd.getNumPartitions() = 92 我希望输出是一个同样按日期分区的镶木地板。
猜你喜欢
  • 2015-08-01
  • 1970-01-01
  • 2021-09-27
  • 2017-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-26
  • 1970-01-01
相关资源
最近更新 更多