【问题标题】:spark read parquet with partition filters vs complete path带分区过滤器与完整路径的火花读取镶木地板
【发布时间】:2020-10-28 11:53:33
【问题描述】:

我在 hdfs 示例中有一个分区拼花数据: hdfs://cluster/stage/data/datawarehouse/table=metrics_data/country=india/year=2020/month=06/day=30/hour=23/

我想了解读取数据的最佳方式:

df = spark.read.parquet("hdfs://cluster/stage/data/datawarehouse/table=metrics_data/country=india/year=2020/month=06/day=30/")。 where(col('hour') == "23")

df = spark.read.parquet("hdfs://cluster/stage/data/datawarehouse/table=metrics_data/country=india/year=2020/month=06/day=30/hour=23 ")

如果有的话,我想了解更多关于性能和其他优势的信息。

【问题讨论】:

    标签: apache-spark pyspark apache-spark-sql parquet


    【解决方案1】:

    这很简单,我们在读取文件时要做的第一件事是使用df = df.filter() 过滤掉不必要的列,这将在读入内存之前过滤掉数据,高级文件格式,如 parquet,ORC 支持概念预测下推更多here,这使您能够以比加载完整数据更快的方式读取数据。

    【讨论】:

    • 感谢您的更新。我想我不清楚我的查询。我了解我们在读取步骤期间将过滤条件应用于分区拼花地板会将过滤器推送到源本身。我想了解与添加过滤条件相比,提供完整路径是否在性能上不好。因为这两个步骤最终都会走上同一条路
    【解决方案2】:

    如果您的目录/文件层次结构较大,则与过滤相比,直接读取单个目录可能会更快,因为 Spark 需要构建一个索引来应用该过滤器。请参阅following question & answer

    【讨论】:

    • 谢谢亚历克斯,这有帮助。是的,我会尝试通过在性能方面验证两种阅读方式来进行一次小检查。
    • 如果我有更复杂的查询@alex-ott,比如时间窗口(2020-10-25 到 2020-11-10)怎么办?
    • 那么你需要发出几个单独的读取,并进行联合...
    • 好的,谢谢,我知道读取多个分区比过滤多个条件更好?换句话说,使用时间窗口过滤 vs 读取目录列表
    • 是的,当您读取每个分区时,Spark 不会读取不在分区键中的数据。如果使用窗口函数,则需要读取数据,然后进行过滤
    【解决方案3】:

    请通读this ariticle。您可以查看查询的物理计划。如果您发现它使用的是 PartitionFilters,则表示您描述的这两种方式并没有太大区别。

    【讨论】:

      猜你喜欢
      • 2018-12-20
      • 2021-06-13
      • 2019-02-19
      • 2021-09-05
      • 1970-01-01
      • 1970-01-01
      • 2017-03-17
      • 2020-01-10
      • 2016-01-18
      相关资源
      最近更新 更多