【问题标题】:Apache Spark dataframe does not repartition while writing to parquetApache Spark 数据帧在写入镶木地板时不会重新分区
【发布时间】:2019-07-19 12:11:55
【问题描述】:

我正在尝试对我的 DataFrame 进行分区并将其写入 parquet 文件。在我看来,重新分区适用于内存中的数据帧,但不影响镶木地板分区。更奇怪的是,coalesce 起作用了。假设我有 DataFrame df:

df.rdd.partitions.size
4000
var df_new = df.repartition(20)
df_new.rdd.partitions.size
20

但是,当我尝试编写 parquet 文件时,我得到以下信息:

df_new.write.parquet("test.paruqet") 
[Stage 0:>                        (0 + 8) / 4000]

这将创建 4000 个文件,但是,如果我这样做,我会得到以下结果:

var df_new = df.coalesce(20)
df_new.write.parquet("test.paruqet")
[Stage 0:>                        (0 + 8) / 20]

我可以得到我想要减少分区的东西。问题是当我需要增加我无法做到的分区数量时。就像如果我有 8 个分区并且我尝试将它们增加到 100,它总是只写 8 个。

有人知道如何解决这个问题吗?

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    首先,您不应该提供parquet() 方法的文件路径,而是提供文件夹。 Spark 将自行处理 parquet 文件名。

    然后,您必须知道coalesce减少分区数量(无随机播放),而repartition 允许您在任意数量的分区中重新分区(使用随机播放)您的 DataFrame你需要(或多或少)。查看this SO 问题以了解有关repartitioncoalesce 的更多详细信息。

    在你的情况下,你想增加分区的数量,所以你需要使用repartition

    df.repartition(20).write.parquet("/path/to/folder")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-27
      • 2019-03-04
      • 2021-03-26
      • 1970-01-01
      • 1970-01-01
      • 2019-10-13
      • 2016-09-03
      • 1970-01-01
      相关资源
      最近更新 更多