謂詞下推
謂詞下推
摘要
經常聽到謂詞下推
這個顯得高大上的詞,但一直沒有真正理解到底是啥意思。查了一些資料,有了一定理解,在這裡記錄下。
0x01 什麼是謂詞
謂詞,用來描述或判定客體性質、特徵或者客體之間關係的詞項。根據《現代漢語》的定義漢語的謂詞包括動詞和形容詞。
謂詞,英文翻譯為predicate
,而謂詞下推的英文定義如下:
A predicate is a function that returns bool (or something that can be implicitly converted to bool)
也就是說,謂詞下推
概念中的謂詞指返回bool
true
和false
的函式,或是隱式轉換為bool的函式:
- 如SQL中的謂詞主要有
LKIE
、BETWEEN
、IS NULL
、IS NOT NULL
、IN
、EXISTS
。 - 如Spark中的
input.filter(x=> x >= 5)
0x02 什麼是謂詞下推
謂詞下推的基本思想即:
將過濾表示式儘可能移動至靠近資料來源的位置,以使真正執行時能直接跳過無關的資料。
在傳統資料庫以及NoSql中都有謂詞下推的概念。
在檔案格式使用Parquet
或orcfile
時,甚至可能整塊跳過不相關的檔案。
0x03 謂詞下推應用
3.1 Impala on Parquet
RF演算法中,用了謂詞下推思想。大小表進行broadcast hash join
時,用小表的join列資料構建BloomFilter,廣播到大表的所有partition,使用該BloomFilter對大表join列資料進行過濾。最後將大表過濾後得到的資料與小表資料進行hashJoin。
這個過程如下圖:
這樣的好處是:
- 在儲存層即過濾了大量大表無效資料,減少掃描無效資料列的同行其他列資料IO
- 減少儲存程序到計算程序傳輸的資料
- 減少
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.optimize.ppd
,預設為true
,即開啟謂詞下推,關於join和where採用ppd
的規則如下:
結論:
- 所謂下推,即謂詞過濾在
map
端執行;所謂不下推,即謂詞過濾在reduce
端執行 - inner join時,謂詞任意放都會下推
- left join時,左表的謂詞應該寫在
where
後,右表的謂詞應寫在後 - right join時,左表的謂詞應該寫在
join
後,右表的謂詞應寫在where
後
3.3 HBase
在HBase 0.92版以後引入了協處理器,就有複雜過濾器實現了謂詞下推功能。