謂詞下推操作,其實Hive也陸陸續續做了一定的優化操作,但是有些地方還需要我們自己人為的去進行優化,
1.在join操作中,針對一般的單表過濾條件,操作的時候盡量直接進行謂詞下推操作(即把過濾條件直接放到子查詢當中),不要把過濾條件在放到on后面的where條件中,防止查詢的數據不准確性。
2.在join操作中,涉及到在on后面進行where判斷(主要涉及到雙表或者多表條件判斷,比如:on a.id=b.id where a.dt=>b.start_dt and a.dt<=b.end_dt),或者case when判斷多表條件操作,或者select *from a where id in(select id from b)tmp等操作時。
針對上述的幾種情況來說,其實就是發生了雙表(或者多表的操作判斷),如果采用上述操作計算的話,則都會產生大量的map或者reduce操作,極大的影響執行效率,
因為這種不等值連接,或者in(子查詢)等,都會進行雙表(或者多表)全掃描操作,不會進行謂詞下推操作。
針對上述情況,暫時的處理的方法,使用的是shell腳本傳參變量,然后進行操作。當然如果數據量不大的情況下,減少腳本的復雜性等,直接使用上正常述操作就行
start_dt=(`mysql -A dbname -hdb_host -udb_user -pdb_pwd -ss -e 'SELECT start_dt FROM b"'`)
select * from a where dt>='${start_dt}' ;
謂詞下推參考:
參考:
從一個sql引發的hive謂詞下推的全面復盤及源碼分析(on where執行順序問題及源碼分析)