1. 程式人生 > >謂詞下推

謂詞下推

謂詞下推

摘要

經常聽到謂詞下推這個顯得高大上的詞,但一直沒有真正理解到底是啥意思。查了一些資料,有了一定理解,在這裡記錄下。

0x01 什麼是謂詞

謂詞,用來描述或判定客體性質、特徵或者客體之間關係的詞項。根據《現代漢語》的定義漢語的謂詞包括動詞和形容詞。

謂詞,英文翻譯為predicate,而謂詞下推的英文定義如下:

A predicate is a function that returns bool (or something that can be implicitly converted to bool)

也就是說,謂詞下推概念中的謂詞指返回bool

值即truefalse的函式,或是隱式轉換為bool的函式:

  • 如SQL中的謂詞主要有 LKIEBETWEENIS NULLIS NOT NULLINEXISTS
  • 如Spark中的input.filter(x=> x >= 5)

0x02 什麼是謂詞下推

謂詞下推的基本思想即:

將過濾表示式儘可能移動至靠近資料來源的位置,以使真正執行時能直接跳過無關的資料。

在傳統資料庫以及NoSql中都有謂詞下推的概念。

在檔案格式使用Parquetorcfile時,甚至可能整塊跳過不相關的檔案。

0x03 謂詞下推應用

3.1 Impala on Parquet

RF演算法中,用了謂詞下推思想。大小表進行broadcast hash join時,用小表的join列資料構建BloomFilter,廣播到大表的所有partition,使用該BloomFilter對大表join列資料進行過濾。最後將大表過濾後得到的資料與小表資料進行hashJoin。

這個過程如下圖:
SparkSql
這樣的好處是:

  1. 在儲存層即過濾了大量大表無效資料,減少掃描無效資料列的同行其他列資料IO
  2. 減少儲存程序到計算程序傳輸的資料
  3. 減少hashjoin開銷

如這個sql:

select item.name, order.* from order , item where order.item_id =

item.id and item.category = ‘book’

使用謂詞下推,會將表示式 item.category = ‘book’下推到join條件order.item_id = item.id之前。再往高大上的方面說,就是將過濾表示式下推到儲存層直接過濾資料,減少傳輸到計算層的資料量。

3.2 Hive

Hive中的Predicate Pushdown簡稱謂詞下推,主要思想是把過濾條件下推到map端,提前執行過濾,以減少map到reduce的傳輸資料,提升整體效能。

可參考Hive Outer Join Behavior

具體配置項是hive.optimize.ppd,預設為true,即開啟謂詞下推,關於join和where採用ppd的規則如下:

PPD規則

結論:

  1. 所謂下推,即謂詞過濾在map端執行;所謂不下推,即謂詞過濾在reduce端執行
  2. inner join時,謂詞任意放都會下推
  3. left join時,左表的謂詞應該寫在where後,右表的謂詞應寫在後
  4. right join時,左表的謂詞應該寫在join後,右表的謂詞應寫在where

3.3 HBase

在HBase 0.92版以後引入了協處理器,就有複雜過濾器實現了謂詞下推功能。

0xFF 參考文件

sparksql 中外連線查詢中的謂詞下推處理

SparkSql 中外連線查詢中的謂詞下推規則

BigData – Join中竟然也有謂詞下推!?

Hive中的Predicate Pushdown Rules(謂詞下推規則)