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

6tqwzwtp  于 2021-05-24  发布在  Spark
关注(0)|答案(1)|浏览(433)

我每天都有一份工作,把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如何进行内部分区修剪?

ndh0cuux

ndh0cuux1#

有很大的不同。
在第一种情况下,您将读取所有文件,然后过滤,在第二种情况下,您将只读取所选文件(过滤已经由分区完成)。
您可以使用 explain() 功能。在你的filescan avro中你会看到 PushedFilters 以及 PartitionFilters 在您的例子中,您的过滤器不是 predicate 下推的。
您可以在这里找到更多信息:https://jaceklaskowski.gitbooks.io/mastering-spark-sql/content/spark-sql-optimizer-pushdownpredicate.html

相关问题