普及一個術語:謂詞下推
謂詞下推是一種自動優化規則,如果養成好的查詢習慣你其實並不需要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
參考: