【问题标题】:Predicate Push Down vs Bloom Filters谓词下推与布隆过滤器
【发布时间】:2019-07-04 12:21:21
【问题描述】:

在寻找大数据特别是 ORC 文件的查询优化时,我遇到了两种可能的谓词下推和布隆过滤器。

谓词下推有助于我们避免读取不必要的条带,这有助于减少 IO ,但在我看来,Bloom Filter 似乎也有同样的目的,除了下面的。

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

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

谢谢 桑托什

【问题讨论】:

    标签: bigdata orc


    【解决方案1】:

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

    【讨论】:

    • 嗨 Ajay,感谢您回答我的问题,如果我在没有 Bloom Filters 的情况下正确理解它,谓词下推工作基于每个条带创建的索引,例如存储在条带级别的 Min、Max 值。当创建布隆过滤器时,谓词下推需要布隆过滤器的帮助以进一步减少数据集。谢谢
    • 如果上述陈述是正确的,我有基于布隆过滤器行为的后续问题,似乎他们只提供数据点是否存在于集合(或)中的信息,这没有帮助跳过整个条带,但我不明白的是它如何帮助减少从条带读取的行数。
    • @VaradaSantosh 检查条带的 Min,Max 指示条带中可能存在列值。如果值不存在,布隆过滤器将有助于跳过此条带,因为布隆过滤器对于没有值的情况是 100% 正确的。但是布隆过滤器可能会报告误报,因此在这种情况下需要对条带进行扫描。因此,布隆过滤器有助于在条带中不存在值时跳过条带,从而减少读取的行数。并不是说它减少了在条带中读取的行数。
    • 使用 (Min,Max) 和bloomfilter 读取的行
    【解决方案2】:

    因为 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

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-12
      • 1970-01-01
      • 2016-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多