【发布时间】:2019-07-04 12:21:21
【问题描述】:
在寻找大数据特别是 ORC 文件的查询优化时,我遇到了两种可能的谓词下推和布隆过滤器。
谓词下推有助于我们避免读取不必要的条带,这有助于减少 IO ,但在我看来,Bloom Filter 似乎也有同样的目的,除了下面的。
对于谓词下推,我们不需要在写入 ORC 文件时显式创建任何工件,而对于 Bloom 过滤器,我们需要在写入 ORC 文件时配置列。
请求建议以加深我的理解。
谢谢 桑托什
【问题讨论】:
在寻找大数据特别是 ORC 文件的查询优化时,我遇到了两种可能的谓词下推和布隆过滤器。
谓词下推有助于我们避免读取不必要的条带,这有助于减少 IO ,但在我看来,Bloom Filter 似乎也有同样的目的,除了下面的。
对于谓词下推,我们不需要在写入 ORC 文件时显式创建任何工件,而对于 Bloom 过滤器,我们需要在写入 ORC 文件时配置列。
请求建议以加深我的理解。
谢谢 桑托什
【问题讨论】:
布隆过滤器由谓词下推使用。谓词下推主要使用列统计信息来跳过行组并最小化读取的行数。如果使用布隆过滤器,则谓词下推可以最大限度地减少进一步读取的行数。
【讨论】:
因为 ORC 文件是类型感知的,所以写入者会为该类型选择最合适的编码,并在写入文件时建立一个内部索引。
谓词下推使用这些索引来确定需要为特定查询读取文件中的哪些条带,并且行索引可以将搜索范围缩小到 10,000 行的特定集合
另请参阅:https://orc.apache.org/docs/index.html
关于谓词下推的一个很好的定义可以找到here 和:
ORC 在每个文件中提供三级索引:
列统计信息始终包含值的计数以及是否存在空值。大多数其他原始类型包括最小值和最大值,对于数字类型,包括总和。 从 Hive 1.2 开始,索引可以包含布隆过滤器,它提供了更具选择性的过滤器。
https://orc.apache.org/docs/indexes.html
Spark SQL 中默认启用 ORC 谓词下推。
Bloom filters are only useful for equality, not less than or greater than.
“布隆过滤器是一种节省空间的概率数据结构,由 Burton Howard Bloom 在 1970 年提出,用于测试元素是否是集合的成员。误报匹配是可能,但不会出现假阴性 - 换句话说,查询返回“可能在集合中”或“绝对不在集合中”。”
参见:
https://llimllib.github.io/bloomfilter-tutorial/
https://en.wikipedia.org/wiki/Bloom_filter
https://docs.cloudera.com/runtime/7.2.8/developing-spark-applications/topics/spark-predicate-push-down-optimization.html
【讨论】: