Hive的SQL操做 緩存
•基本的Select 操做 spa
SELECT [ALL | DISTINCT] select_expr, select_expr, … FROM table_reference 排序 [WHERE where_condition] ci [GROUP BY col_list [HAVING condition]] 字符串 [ CLUSTER BY col_list input | [DISTRIBUTE BY col_list] [SORT BY| ORDER BY col_list] it ] io [LIMIT number] table |
1. 使用ALL和DISTINCT選項區分對重複記錄的處理。默認是ALL,表示查詢全部記錄。DISTINCT表示去掉重複的記錄。 2. Where 條件:相似咱們傳統SQL的where 條件 function 3. 0.9版本支持between,還不支持EXIST ,NOT EXIST 4. ORDER BY與SORT BY的不一樣:ORDER BY 全局排序,只有一個Reduce任務,SORT BY 只在本機作排序 Limit:Limit 能夠限制查詢的記錄數,如:SELECT * FROM t1 LIMIT 5 |
•基於Partition的查詢
以下面的查詢語句:SELECT day_table.* FROM day_table WHERE day_table.dt>= ’2008-08-08′; dt是day_table表的分區字段。 |
•Join語句
•Hive 只支持等值鏈接(equality joins)、外鏈接(outer joins)和(left semi joins)。Hive 不支持全部非等值的鏈接,由於非等值鏈接很是難轉化到 map/reduce 任務 •LEFT,RIGHT和FULL OUTER關鍵字用於處理join中空記錄的狀況 •LEFT SEMI JOIN 是 IN/EXISTS 子查詢的一種更高效的實現 •join 時,每次 map/reduce 任務的邏輯是這樣的:reducer 會緩存 join 序列中除了最後一個表的全部表的記錄,再經過最後一個表將結果序列化到文件系統 •實踐中,應該把最大的那個表寫在最後 join 查詢時,須要注意幾個關鍵點 •只支持等值join •SELECT a.* FROM a JOIN b ON (a.id = b.id) •SELECT a.* FROM a JOIN b ON (a.id = b.id AND a.department = b.department) •能夠 join 多於 2 個表,例如 SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key2) •若是join中多個表的 join key 是同一個,則 join 會被轉化爲單個 map/reduce 任務 LEFT,RIGHT和FULL OUTER •例子 •SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON (a.key=b.key) •若是你想限制 join 的輸出,應該在 WHERE 子句中寫過濾條件——或是在 join 子句中寫 •容易混淆的問題是表分區的狀況 • SELECT c.val, d.val FROM c LEFT OUTER JOIN d ON (c.key=d.key) WHERE a.ds=’2010-07-07′ AND b.ds=’2010-07-07‘ •若是 d 表中找不到對應 c 表的記錄,d 表的全部列都會列出 NULL,包括 ds 列。也就是說,join 會過濾 d 表中不能找到匹配 c 表 join key 的全部記錄。這樣的話,LEFT OUTER 就使得查詢結果與 WHERE 子句無關 •解決辦法 •SELECT c.val, d.val FROM c LEFT OUTER JOIN d ON (c.key=d.key AND d.ds=’2009-07-07′ AND c.ds=’2009-07-07′) LEFT SEMI JOIN •LEFT SEMI JOIN 的限制是, JOIN 子句中右邊的表只能在 ON 子句中設置過濾條件,在 WHERE 子句、SELECT 子句或其餘地方過濾都不行 •SELECT a.key, a.value FROM a WHERE a.key in (SELECT b.key FROM B); 能夠被重寫爲: SELECT a.key, a.val FROM a LEFT SEMI JOIN b on (a.key = b.key) UNION ALL •用來合併多個select的查詢結果,須要保證select中字段須一致 •select_statement UNION ALL select_statement UNION ALL select_statement …
|
SQL中對兩表內聯能夠寫成:
•select * from dual a,dual b where a.key = b.key;
Hive中應爲
•select * from dual a join dual b on a.key = b.key;
分號字符
•分號是SQL語句結束標記,在HiveQL中也是,可是在HiveQL中,對分號的識別沒有那麼智慧,例如:
•select concat(key,concat(‘;’,key)) from dual;
但HiveQL在解析語句時提示:
FAILED: Parse Error: line 0:-1 mismatched input ‘<EOF>’ expecting ) in function specification
•解決的辦法是,使用分號的八進制的ASCII碼進行轉義,那麼上述語句應寫成:
•select concat(key,concat(‘\073′,key)) from dual;
IS [NOT] NULL
•SQL中null表明空值, 值得警戒的是, 在HiveQL中String類型的字段如果空(empty)字符串, 即長度爲0, 那麼對它進行IS NULL的判斷結果是False.