谓词下推vs布隆过滤器

时间:2019-02-11 02:31:47

标签: bigdata orc

在寻找针对大数据(尤其是ORC文件)的查询优化时,我遇到了两种可能性:谓词下推和Bloom过滤器。

谓词下推有助于我们避免读取不必要的条纹,这有助于减少IO,但对我来说,Bloom Filter似乎除以下内容外还具有相同的用途。

对于谓词下推,我们不需要在编写ORC文件时显式创建任何工件,而对于Bloom过滤器,我们需要在写入ORC文件时配置列。

请求建议以加深我的理解。

谢谢 桑托什

2 个答案:

答案 0 :(得分:0)

Bloom过滤器用于谓词下推。谓词下推主要使用列统计信息来跳过行组并最大程度地减少读取的行数。如果使用Bloom过滤器,则谓词下推可以最大程度地减少进一步读取的行数。

答案 1 :(得分:0)

因为 ORC 文件是类型感知的,所以作者会为类型选择最合适的编码,并在写入文件时构建内部索引。

谓词下推使用这些索引来确定需要为特定查询读取文件中的哪些条带,并且行索引可以将搜索范围缩小到 10,000 行的特定集合

另见:https://orc.apache.org/docs/index.html

  • 谓词下推需要像apache spark这样的查询引擎来实现

关于谓词下推的一个很好的定义可以在 here 和:

https://medium.com/microsoftazure/data-at-scale-learn-how-predicate-pushdown-will-save-you-money-7063b80878d7#:~:text=What%20is%20Predicate%20Pushdown%3F,are%20referred%20to%20as%20predicates.&text=It%20can%20improve%20query%20performance,%2FO)%20from%20Storage%20files

ORC 在每个文件中提供三级索引:

  1. 文件级别 - 有关整个文件中每列中的值的统计信息
  2. 条带级别 - 每个条带的每列中的值的统计信息
  3. 行级别 - 有关条带内每组 10,000 行的每列中的值的统计信息

列统计信息始终包含值的计数以及是否存在空值。大多数其他原始类型包括最小值和最大值,对于数字类型,包括总和。 从 Hive 1.2 开始,索引可以包含布隆过滤器,从而提供更具选择性的过滤器

https://orc.apache.org/docs/indexes.html

ORC 谓词下推在 Spark SQL 中默认启用。

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