【问题标题】:Spark enforce partitioning on readSpark 在读取时强制分区
【发布时间】:2020-08-21 05:05:43
【问题描述】:

我有一个分区如下的数据集:

raw_data/year=2020/month=05/day=01/hour=00/minute=00/xxx.parquet
raw_data/year=2020/month=05/day=01/hour=00/minute=01/xxx.parquet
...
...
raw_data/year=2020/month=05/day=01/hour=01/minute=00/xxx.parquet
...

我想加载大量分区(比如 1 个月),每小时聚合它们,然后使用以下分区保存:

processed_data/year=2020/month=05/day=01/hour=00/yyy.parquet
processed_data/year=2020/month=05/day=01/hour=01/yyy.parquet
...

我觉得,如果 Spark 可以读取数据集,使得每个执行程序读取 hour 分区下的所有文件,它将最大限度地减少重新洗牌。有没有办法指定 Spark 的分区读取模式?

【问题讨论】:

    标签: apache-spark apache-spark-sql


    【解决方案1】:

    最佳方法是根据本文档:http://tantusdata.com/spark-shuffle-case-1-partition-by-and-repartition/

    df.repartition...write.partitionBy... 避免洗牌和更好的后续读取性能。

    Spark partition discovery 使用基本路径读取也会有所帮助。

    【讨论】:

      【解决方案2】:

      我认为最好以您希望读取数据的方式保存数据,而不是尝试自定义 Spark 加载数据的方式。

      您可以根据需要读取所有数据并按小时对其进行分区。可能您需要先创建一个类似“年-月-日-小时”的列,然后您可以根据该列重新分区数据。

      df.repartition(col("year-month-day-hour")).write.format("parquet").save(path-to-file)
      

      【讨论】:

      • repartitionBy 是一个更安全的选择
      • 保存,你的意思是在他的湖的原始区域是如何保存的?
      • 认为两者都需要
      猜你喜欢
      • 2021-07-23
      • 1970-01-01
      • 2018-11-27
      • 1970-01-01
      • 1970-01-01
      • 2020-02-06
      • 1970-01-01
      • 1970-01-01
      • 2018-02-16
      相关资源
      最近更新 更多