PySpark中DataFilter是什么?与PushedFilter有何区别?
Spark执行计划中DataFilter与PushedFilter的区别
你的执行计划内容:
FileScan parquet [product_id#12,price#14] Batched: true, DataFilters: [isnotnull(product_id#12)], Format: Parquet, Location: InMemoryFileIndex[gs://monsoon-credittech.appspot.com/spark_datasets/products_parquet_dtc], PartitionFilters: [], PushedFilters: [IsNotNull(product_id)], ReadSchema: struct<product_id:int,price:int>
其中涉及的三个过滤器项:
- PartitionFilters: []
- PushedFilters: [IsNotNull(product_id)]
- DataFilters: [isnotnull(product_id#12)]
解答:
你对PushedFilter的理解没有问题,DataFilter和PushedFilter是Spark执行计划中不同阶段的产物,核心区别如下:
- DataFilter:是Spark从查询SQL解析出的原始逻辑过滤条件,属于逻辑计划阶段的产物,会带上Spark内部生成的列ID(比如
product_id#12)。它代表了Spark需要对数据执行的所有过滤操作,不管这个操作能不能被下推到数据源执行。 - PushedFilter:是经过Spark优化后,实际下推到数据源(如Parquet文件系统)执行的过滤条件,属于物理计划阶段的产物。它是DataFilter的子集——只有数据源原生支持的过滤操作(比如Parquet支持的非空判断、等值匹配),才会被转化为PushedFilter,在数据读取阶段就完成过滤,以此减少IO量和后续计算压力。
举个更直观的例子:如果你的查询是WHERE product_id IS NOT NULL AND price > 100,而Parquet因不支持动态范围过滤未下推price > 100,那么:
- DataFilters会是
[isnotnull(product_id#12), (price#14 > 100)] - PushedFilters只会是
[IsNotNull(product_id)]
剩下的price > 100会在Spark读取数据后,在内存中完成过滤。
回到你的执行计划,两者内容相似是因为这次的过滤条件刚好被完全下推,但它们的本质是逻辑计划与物理计划阶段的不同产物,并非同一个概念。
内容的提问来源于stack exchange,提问作者figs_and_nuts
相关产品推荐
相关产品推荐

