Hive謂詞下推

普及一個術語:謂詞下推

謂詞下推是一種自動優化規則,如果養成好的查詢習慣你其實並不需要hive自動去幫你謂詞下推。

因爲優化器的規則經常變,記住規則比較難,養成好的查詢習慣比較簡單。

如果沒有聽說過這個術語,沒關係,很有可能的是你已經養成了好的查詢習慣,根本不需要hive幫你優化,但還是瞭解一下好。

謂詞下推 Predicate Pushdown(PPD):簡而言之,就是在不影響結果的情況下,儘量將過濾條件提前執行。謂詞下推後,過濾條件在map端執行,減少了map端的輸出,降低了數據在集羣上傳輸的量,節約了集羣的資源,也提升了任務的性能。——《Hive中的Predicate Pushdown Rules(謂詞下推規則)》

 

所以,如果我們能夠做到,先過濾,再join,先篩選出有用的數據,再進行其他操作,我們其實不需要知道“謂詞下推”這個術語。

但是,知道它,可以避免一些失誤。同時,可以拓寬自己的知識面。

所謂hive中的謂詞下推指的是:

 hive中join操作:如果直接兩個表進行join,在最後再進行兩個表的where條件過濾,這樣的話實際上hive會將兩個表先join起來,最後join出來的大表再進行where篩選,這樣的話導致了全表join並且效率低下:

如下:

    select a.id,a.value1,b.value2 from table1 a
      left outer join table2 b on a.id=b.id
    where b.ds>='20181201' and b.ds<'20190101'
    and a.ds>='20181201' and a.ds<'20190101'

效率很低並且佔用集羣性能!!

但是我們在hive的join查詢的時候,先將每個表的數據進行篩選,篩選完了之後的數據在進行join這樣,join兩端的表數據量就相對變得很少了,提升了效率,也比變了佔用更多的集羣資源。

採取的方式是:

    select a.id,a.value1,b.value2 from
      (select * from table1 ss where ss.ds>='20181201' and ss.ds<'20190101' ) a
    left outer join
      (select * from table2 ss where ss.ds>='20181201' and ss.ds<'20190101' ) b
    on a.id=b.id

 
參考:

hive優化之謂詞下推

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章