【问题标题】:Partitioning strategy in Parquet and SparkParquet 和 Spark 中的分区策略
【发布时间】:2019-02-17 09:16:19
【问题描述】:

我的工作是读取 csv 文件,将其转换为数据帧并在 Parquet 中写入。我在 Parquet 中写入数据时使用附加模式。使用这种方法,每次写入都会生成一个单独的 Parquet 文件。我的问题是:

  • 1) 如果每次我将数据写入 Parquet 模式时,都会获得一个新文件 附加,它会影响读取性能(因为数据现在 分布在不同长度的分区 Parquet 文件中)
  • 2) 有没有办法纯粹基于生成 Parquet 分区 数据的大小?
  • 3) 我们是否需要考虑自定义分区策略来实施 第 2 点? 我正在使用 Spark 2.3

【问题讨论】:

    标签: apache-spark parquet


    【解决方案1】:
    1. 会影响读取性能,如果 spark.sql.parquet.mergeSchema=true.

      在这种情况下,Spark 需要访问每个文件并从中获取架构 它。

      在其他情况下,我相信它不会对读取性能产生太大影响。

    2. 没有办法纯粹根据数据大小生成。您可以使用 repartitioncoalesce。后者会造成产出不均 文件,但性能非常好。

      另外,您有配置 spark.sql.files.maxRecordsPerFile 或选项 maxRecordsPerFile 防止文件过大,但通常是 不是问题。

    3. 是的,我认为 Spark 没有内置 API 来按数据均匀分布 尺寸。有Column Statistics Size Estimator 可能会对此有所帮助。

    【讨论】:

    • 我可能会遇到添加记录很少的情况,在这种情况下,如果我使用追加写入模式,它将创建一个数据很少的新分区。如果我使用 repartition 或 coalesce ,我必须读取整个 Parquet 数据,然后使用 coalesce 合并分区,删除所有旧分区,然后存储这个新的重新分区数据帧。这是正确的方法吗?
    猜你喜欢
    • 2019-03-02
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 2019-09-24
    • 2018-09-17
    • 2019-07-29
    相关资源
    最近更新 更多