apache-spark - Spark 的 Partition Pruning 和 Predicate Pushdown 有什么区别?
问题描述
我正在研究 Spark 优化方法,并遇到了各种实现优化的方法。但有两个名字引起了我的注意。
- 分区修剪
- 谓词下推
他们说:
分区修剪:
分区修剪是一种性能优化,它限制 Spark 在查询时读取的文件和分区的数量。对数据进行分区后,匹配特定分区过滤条件的查询通过允许 Spark 仅读取目录和文件的子集来提高性能。
谓词下推:
Spark 将尝试将数据过滤移动到尽可能靠近源的位置,以避免将不必要的数据加载到内存中。Parquet 和 ORC 文件在不同的数据块中维护关于每一列的各种统计信息(例如最小值和最大值)。读取这些文件的程序可以使用这些索引来确定是否需要读取某些块甚至整个文件。这允许程序在处理过程中可能会跳过大量数据。
通过阅读上述概念,它们似乎在做同样的事情,即应用满足查询中给出的谓词的读取语句(查询)。分区修剪和谓词下推是不同的概念还是我以错误的方式看待它们?
解决方案
不同之处在于谁应用了优化,应用了优化以及可以应用到哪些数据源。
分区修剪由 Spark 本身在委托给处理文件格式的数据源之前应用。它仅适用于基于文件的格式,因为数据源还没有分区发现的概念。
谓词下推将行过滤委托给负责处理特定格式的数据源(Spark 对一种数据源的术语)。谓词下推可用于基于文件和非基于文件的源,例如 RDBMS 和 NoSQL 数据库。
推荐阅读
- python - 处理多个 txt 文件的代码优化 (Python 3.6)
- mysql-workbench - 通过 mySQL 捕获每周最新状态
- reactjs - WebSocket 连接到“ws://localhost:8080/”失败:WebSocket 握手期间出错:意外响应代码:404
- android - Android View Binding - Fragment 生命周期中的清除绑定
- rust - 如何根据传入的枚举值使结构实例具有不同类型的字段?
- c++ - 如何将数组设置为具有自定义长度?
- kubernetes-ingress - 可以在单个 Kubernetes 命名空间中安装多个 nginx-ingress 控制器吗?
- javascript - 如何在 Spring thymeleaf 应用程序中获取调用控制器的 url
- javascript - 搜索从数据集中设置 ID 的元素
- python - 如何使用 Python `openpyxl` 读取大纲级别?