我有一份日常工作,将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如何在内部对分区进行修剪?
答案 0 :(得分:0)
有很大的不同。
在第一种情况下,您将先读取所有文件,然后过滤。在第二种情况下,您将仅读取所选文件(分区已完成过滤器)。
您可以使用explain()
函数检查过滤器是否为谓词下推式。在FileScan avro中,您将看到PushedFilters
和PartitionFilters
就您而言,您的过滤器不是谓词下推。
您可以在这里找到更多信息:https://jaceklaskowski.gitbooks.io/mastering-spark-sql/content/spark-sql-Optimizer-PushDownPredicate.html