apache-spark - 无分区列性能的 Spark 下推过滤器
问题描述
当您未在过滤器中包含分区列时,我对 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.spark是否必须从源中列出并扫描位于“路径”中的所有文件?
Yes
,因为您没有对分区列 spark 列表进行过滤并扫描所有文件
2.有一些下推过滤吗?
阅读时将pushdown filter
应用于每个文件
3.spark仅在过滤器中存在分区列的情况下应用下推过滤器?
No
, 分区过滤器将应用于存在分区列的地方,否则将在扫描文件时应用谓词下推。
partition filter vs pushdown filter
- 您可以通过检查 spark 中的解释计划来检查所有这些详细信息
.explain(true)
检查过滤器是否下推enabled or not
:
spark.sql("set spark.sql.parquet.filterPushdown").show(10,false)
//+--------------------------------+-----+
//|key |value|
//+--------------------------------+-----+
//|spark.sql.parquet.filterPushdown|true |
//+--------------------------------+-----+
推荐阅读
- cordova - 如何实现来电视频通话通知
- react-native-device-info - getDeviceName 不会在 android 上返回设备名称
- java - 获取 jvm 中为 lambda 函数加载的所有类的列表
- python - 图像 = ImageTk.PhotoImage 与变量
- c# - 如何从 C# 后面的代码中获取更改的用户控件的类名
- javascript - 将 window.localStorage 键设置为对象时遇到问题
- javascript - 为什么我在 javascript 中爬行时收到 500 错误
- java - 如何解析“{}”空值(转换为字符串)
- symfony - Symfony 4 & webpack encore 在生产环境中,我的 css 和 js 生成的文件没有加载
- angular - 如何防止对同一端点的多次调用