我每天都有一份工作,把avro换成 parquet 。每小时的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格式的数据
但是,对于相同的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如何进行内部分区修剪?
1条答案
按热度按时间ndh0cuux1#
有很大的不同。
在第一种情况下,您将读取所有文件,然后过滤,在第二种情况下,您将只读取所选文件(过滤已经由分区完成)。
您可以使用
explain()
功能。在你的filescan avro中你会看到PushedFilters
以及PartitionFilters
在您的例子中,您的过滤器不是 predicate 下推的。您可以在这里找到更多信息:https://jaceklaskowski.gitbooks.io/mastering-spark-sql/content/spark-sql-optimizer-pushdownpredicate.html