avro分区修剪如何在内部工作?

时间:2020-09-28 14:21:14

标签: apache-spark parquet spark-avro

我有一份日常工作,将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均具有36 TB的avro格式数据

但是,对于相同的火花配置(内存和实例等),以下命令仅运行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如何在内部对分区进行修剪?

1 个答案:

答案 0 :(得分:0)

有很大的不同。

在第一种情况下,您将先读取所有文件,然后过滤。在第二种情况下,您将仅读取所选文件(分区已完成过滤器)。

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

就您而言,您的过滤器不是谓词下推。

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

相关问题