我有一个关于spark中的过滤的问题,当你没有在过滤器中包含分区列时。
假设我有以下按日期划分的数据:
path/date=20200721/part-0000.parquet
part-0001.parquet
part-0002.parquet
path/date=20200722/part-0000.parquet
part-0001.parquet
part-0002.parquet
...
数据有一列名为“action”,其中大约30%的数据值为0,其余的数据值为1
如果我运行以下命令:
spark.read.parquet("s3a://path").filter("action = 0")
spark是否必须列出并扫描源中位于“路径”中的所有文件?或者有一些下推过滤到位?或者spark只在筛选器中存在分区列的情况下应用下推筛选器?
谢谢。
1条答案
按热度按时间vd8tlhqk1#
1.spark是否必须列出并扫描源中位于“路径”中的所有文件?
Yes
,因为您没有对分区列spark list进行过滤并扫描所有文件2.是否存在下推过滤?
会有的
pushdown filter
读取时应用于每个文件3.spark仅适用于过滤器中存在分隔柱的下推过滤器?
No
,分区过滤器将应用于存在分区列的位置,否则将在扫描文件时应用 predicate 下推。partition filter vs pushdown filter
您可以通过检查spark中的explain plan来检查所有这些细节.explain(true)
检查过滤器是否按下enabled or not
: