大資料(二十一):hive查詢語句
一、查詢語句
1.基本語法
SELECT [ALL|DISTINCT] select_expr,select_expr,...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list]
[ORDER BY col_list]
[CLUSTER BY col_list|[DISTRIBUTE BY col_list][SORT BY col_list]]
[LIMIT number]
- SQL語句大小寫不敏感
- SQL可以寫在一行或者多行
- 關鍵字不能被縮寫也不能分行
- 各句子一般要分行寫
- 使用縮排來提高語句的可讀性
2.Where語句
使用WHERE子句,可以將不滿足條件的行過濾掉。where子句緊隨FROM子句。
where語句中的比較運算子
操作符 |
支援的資料型別 |
描述 |
A=B |
基本資料型別 |
如果A等於B則返回TRUE,反之返回FALSE |
A<=>B |
基本資料型別 |
如果A和B都為NULL,則返回TRUE,其他的和等號(=)操作符的結果一直,如果任意一位Null則結果為Null |
A<>B,A!=B |
基本資料型別 |
A或B為Null則返回Null;如果A不等於B,則返回TRUE,反之返回FALSE |
A<=B |
基本資料型別 |
A或B為Null,則返回Null;如果A小於等於B,則返回TRUE,反之返回FALSE |
A>=B |
基本資料型別 |
A或B為Null,則返回Null;如果A大於等於B,則返回TRUE,反之返回FALSE |
A [NOT] BETWEEN B AND C |
基本資料型別 |
如果A,B或者C任一為Null,則返回Null。如果A的值大於等於B而且小於等於C,則結果為TRUE,反之為FALSE。如果使用NOT關鍵字則可以達到相反的效果。 |
A IS NULL |
所有資料型別 |
如果不等於Null,則返回TRUE,反之返回FALSE |
A IS NOT NULL |
所有資料型別 |
如果A本等於Null,則返回TRUE,反之返回FALSE |
IN(數值1,數值2) |
所有資料型別 |
使用IN運算顯示列表中的值 |
A [NOT] LIKE B |
STRING型別 |
B是一個SQL下的簡單正則表示式,如果A與其匹配的話,則返回TRUE;反之返回FALSE。B的表示式說明如下:'x%'表示A必須以字母x開頭,'%x'表示A必須以字母x結尾,而'%x%'表示A包含字母x,可以是任何位置。如果使用NOT則可以達到反效果 |
A RLIKE B,A REGEXP B |
STRING型別 |
B是一個正則表示式,如果A與其匹配,則返回TRUE;反之返回FALSE。匹配使用的是JDK中的正則表示式介面實現的,因為正則也依據其中的規則。 |
- 使用Like運算選擇類似的值
- 選擇條件可以包換字元或者數字:%代表0個或者多個字元,_表示一個字元
- RLIKE子句是HIVE中這個功能的一個擴充套件,其可以通過JAVA的正則表示式這個更強大的語言來指定匹配條件。
3.邏輯運算子
操作符 |
含義 |
AND |
邏輯並 |
OR |
邏輯或 |
NOT |
邏輯否 |
4.Group by語句
GROUP BY語句通常會和聚合函式一起使用,按照一個或者多個列隊結果進行分組,然後對每個組執行聚合操作。
5.Having語句
- Where針對表中的列發揮作用,查詢資料;having針對查詢結果中的列發揮作用,篩選資料。
- where後面不能寫分組函式,而having後面可以使用分組函式
- having只用於group by分組統計語句
二、join連線
Hive支援通常的SQLJOIN語句,但是隻支援等值連線,不支援非等值連線。
- JOIN ON:內連線只有進行連線的兩個表中都存在與連線條件相匹配的資料才會被保留下來。
- LEFT JOIN ON:左外連線JOIN操作符左邊表中符合Where子句的所有記錄將會被返回。
- RIGHT JOIN ON:右外連線JOIN操作符右邊表中符合WHERE子句的所有記錄將會被返回。
- FULL JOIN ON:滿外連線將會返回所有表中符合where語句條件的所有記錄。如果任一表的指定欄位滿意符合條件的值的話,那麼就使用Null代替。
三、排序
1.全域性排序
Order By:全域性排序,只會產生一個MapReduce
- ASC表示升序(預設)
DESC表示降序 - ORDER BY子句在SELECT語句的結尾
- 例項
select * from emp order by sal desc;
2.MapReduce內部排序(Sort By)
設定reduce個數
set mapreduce.job.reduces=3;
查詢例項
select * from emp sort by empno desc;
查詢並將結果匯入到檔案中
insert overwrite local directory '/opt/datas/sortby' select * from emp sort by deptno desc;
3.分割槽排序(Distribute By)
Distribute By:類似MapReduce中partition,進行分割槽,結合sort by使用,Hive要求Distribute By要寫在Sort by語句之前。
對於Distribute By進行測試,一定要分配多reduce進行處理,否則無法看見Distribute By的效果。
insert overwrite local directory '/opt/dates/distribute' select * from emp distribute by deptno sort by empno desc;
3.Cluster By
當Distribute By和sorts by欄位相同的時候,可以使用Cluster By方式。
Cluster By除了具有Distribute By的功能之外還具有sort by的功能。但是排序只能是倒序排序,不能指定排序規則。
select * from emp cluster by deptno;
select * from emp distribute by deptno sort by deptno;
這兩種排序方式是等價的