Hive學習總結之四:HiveQL查詢操做

第三部分:HiveQL 查詢操做

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 …

 

 

第四部分:注意HiveQL區別於SQL的一些狀況

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.

相關文章
相關標籤/搜索