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邏輯執行順序