【问题标题】:How does avro partition pruning work internally?avro 分区修剪如何在内部工作?
【发布时间】:2021-01-14 03:32:19
【问题描述】:

我的日常工作是将 avro 转换为镶木地板。 Avro文件每小时20G,按年、月、日、小时分区 当我像下面这样读取 avro 文件时, spark.read.format("com.databricks.spark.avro").load(basePath).where($year=2020 and $month=9 and $day=1 and $hour=1).write.paritionBy(paritionCol).parquet(path) - 作业运行 1.5 小时 注意:整个文件夹basePath有36TB的avro格式数据

但是,对于相同的 spark 配置(内存和实例等),以下命令仅运行 7 分钟。 spark.read.format("com.databricks.spark.avro").option("basePath", basePath).load(basePath + "year=2020/month=9/day=1/hour=1/").write.paritionBy(paritionCol).parquet(path)。 为什么时间会如此急剧减少? avro如何在内部进行分区修剪?

【问题讨论】:

    标签: apache-spark parquet spark-avro


    【解决方案1】:

    差别很大。

    在第一种情况下,您将读取所有文件然后过滤,在第二种情况下,您将只读取选定的文件(过滤已经通过分区完成)。

    您可以使用explain() 函数检查过滤器是否为谓词下推。在您的 FileScan avro 中,您将看到 PushedFiltersPartitionFilters

    在您的情况下,您的过滤器不是谓词下推。

    您可以在这里找到更多信息:https://jaceklaskowski.gitbooks.io/mastering-spark-sql/content/spark-sql-Optimizer-PushDownPredicate.html

    【讨论】:

    • 谢谢@maxime G 如果您能提供一些链接或文档,以获取更多关于 avro 如何在内部工作的信息,而不是仅限于我的问题,那就太好了?
    • 这与 avro 无关,它与镶木地板和其他来源的“问题”相同。你可以在这里找到更多信息:jaceklaskowski.gitbooks.io/mastering-spark-sql/content/…
    • 文档说谓词用于提高搜索效率并在缓冲到内存之前排除不必要的数据。但是为什么仍然需要 1.5 小时?什么在这里不起作用?
    猜你喜欢
    • 1970-01-01
    • 2012-04-17
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多