You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 02:40:28