HiveQL邏輯執行順序

FROM->WHERE->GROUP BY->HAVING->SELECT->ORDER BY

Hive總是按照從左到右的順序執行的,如a、b、c三個表關聯

select a.id,b.colname,c.colname from a join b on a.id = b.id join c on a.id = c.id
大多數情況下,hive會對每個join連接對象啓動一個MapReduce任務,上面的列子首先會啓動一個MapReduce job對錶a和表b進行連接操作,然後會再啓動一個MapReduce job將第一個MapReduce job的輸出和表c進行連接操作。當對3個或以上的表進行join連接時,如果每個on子句都使用相同的連接鍵,那麼只會產生一個MapReduce job。
因此對於有join的操作要特別注意:
將數據量小的表放在join的左邊,保證查詢中表的大小從左到右是依次增加的。
普通的join操作,會在map端根據key的hash值,shuffle到某一個reduce上去,在reduce端做join連接操作,內存中緩存join左邊的表,遍歷右邊的表

Oracle、SQL Server中SELECT的列別名只有ORDER BY可以用
HiveSQL基於MySQL存儲的元數據信息,HAVING後可使用SELECT指定的別名
邏輯執行順序:

1.FROM <left_table>
3.<join_type> JOIN <right_table> 2.ON <join_condition>
4.WHERE <where_condition>
5.GROUP BY <group_by_list>
6.WITH {cube|rollup}
7.HAVING <having_condition>
8.SELECT 9.DISTINCT 11.<top_specification> <select_list>
10.ORDER BY <order_by_list>
---------------------------------------------------------------------------------------------------------------------------

1.FROM:對FROM子句中前兩個表執行笛卡爾積生成虛擬表vt1
2.ON:對vt1表應用ON篩選器只有滿足<join_condition>爲真的行才被插入vt2
3.OUTER(join):如果指定了 OUTER JOIN保留表(preserved table)中未找到的行將行作爲外部行添加到vt2 
生成t3如果from包含兩個以上表則對上一個聯結生成的結果表和下一個表重複執行步驟和步驟直接結束
4.WHERE:對vt3應用 WHERE 篩選器只有使<where_condition>爲true的行才被插入vt4
5.GROUP BY:按GROUP BY子句中的列列表對vt4中的行分組生成vt5
6.CUBE|ROLLUP:把超組(supergroups)插入vt6 生成vt6
7.HAVING:對vt6應用HAVING篩選器只有使<having_condition>爲true的組才插入vt7
8.SELECT:處理select列表產生vt8
9.DISTINCT:將重複的行從vt8中去除產生vt9
10.ORDER BY:將vt9的行按order by子句中的列列表排序生成一個遊標vc10
11.TOP:從vc10的開始處選擇指定數量或比例的行生成vt11 並返回調用者
--SQLServer中支持Values claues With table constructor,返回結果200
SELECT ROUND((100*(100000/new.uv))-100,4) AS rate FROM (VALUES(32525))new(uv)
SELECT ROUND((100*(100000/32525))-100,4) AS rate
--Hive中不支持Values claues With table constructor
FAILED: SemanticException [Error 10296]: Values clause with table constructor not yet supported
--用實際值測試返回結果207.4558,相比SQLServer不需要顯式整型的轉換了
SELECT ROUND((100*(100000/32525))-100,4) AS rate

HiveQL邏輯執行順序 - 博客園


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