hive 你所不知道的特殊函數

關注微信公共號:小程在線

關注CSDN博客:程志偉的博客

1.分區排序(Distribute By)
Distribute By: 類似 MR 中 partition, 進行分區, 結合 sort by 使用。
注意, Hive 要求 DISTRIBUTE BY 語句要寫在 SORT BY 語句之前。
對於 distribute by 進行測試, 一定要分配多 reduce 進行處理, 否則無法看到 distribute by的效果。
案例實操:
(1) 先按照部門編號分區, 再按照員工編號降序排序。
hive (default)> set mapreduce.job.reduces=3;


hive (default)> insert overwrite local directory
'/opt/module/datas/distribute-result' select * from emp distribute by deptno sort by empno desc;

 

2.Cluster By
當 distribute by 和 sorts by 字段相同時, 可以使用 cluster by 方式。
cluster by 除了具有 distribute by 的功能外還兼具 sort by 的功能。但是排序只能是倒序排序, 不能指定排序規則爲 ASC 或者 DESC。
1) 以下兩種寫法等價
hive (default)> select * from emp cluster by deptno;
hive (default)> select * from emp distribute by deptno sort by deptno;
注意: 按照部門編號分區, 不一定就是固定死的數值, 可以是 20 號和 30 號部門分到一個分區裏面去。

 

3.分桶抽樣查詢
對於非常大的數據集,有時用戶需要使用的是一個具有代表性的查詢結果而不是全部結果。 Hive 可以通過對錶進行抽樣來滿足這個需求。查詢表 stu_buck 中的數據。
hive (default)> select * from stu_buck tablesample(bucket 1 out of 4 on id);
注: tablesample 是抽樣語句, 語法: TABLESAMPLE(BUCKET x OUT OF y) 。


y 必須是 table 總 bucket 數的倍數或者因子。 hive 根據 y 的大小, 決定抽樣的比例。 例
如, table 總共分了 4 份, 當 y=2 時, 抽取(4/2=)2 個 bucket 的數據, 當 y=8 時, 抽取(4/8=)1/2個 bucket 的數據。
x 表示從哪個 bucket 開始抽取, 如果需要取多個分區, 以後的分區號爲當前分區號加上y

例如, table 總 bucket 數爲 4, tablesample(bucket 1 out of 2), 表示總共抽取(4/2=) 2 個bucket 的數據, 抽取第 1(x)個和第 4(x+y)個 bucket 的數據。


注意: x 的值必須小於等於 y 的值, 否則
FAILED: SemanticException [Error 10061]: Numerator should not be bigger than
denominator in sample clause for table stu_buck

4.行轉列

CONCAT(string A/col, string B/col…): 返回輸入字符串連接後的結果, 支持任意個輸入字符串;


CONCAT_WS(separator, str1, s4tr2,...): 它是一個特殊形式的 CONCAT()。 第一個參數剩餘參數間的分隔符。 分隔符可以是與剩餘參數一樣的字符串。 如果分隔符是 NULL,返回值也將爲 NULL。 這個函數會跳過分隔符參數後的任何 NULL 和空字符串。 分隔符將被加到被連接的字符串之間;


COLLECT_SET(col): 函數只接受基本數據類型, 它的主要作用是將某字段的值進行去重彙總, 產生 array 類型字段。
 

5.列轉行

EXPLODE(col): 將 hive 一列中複雜的 array 或者 map 結構拆分成多行。

用法: LATERAL VIEW udtf(expression) tableAlias AS columnAlias
解釋: 用於和 split, explode 等 UDTF 一起使用, 它能夠將一列數據拆成多行數據, 在此基礎上可以對拆分後的數據進行聚合

 

6.窗口函數

OVER(): 指定分析函數工作的數據窗口大小, 這個數據窗口大小可能會隨着行的變而變化
CURRENT ROW: 當前行
n PRECEDING: 往前 n 行數據
n FOLLOWING: 往後 n 行數據
UNBOUNDED: 起點, UNBOUNDED PRECEDING 表示從前面的起點, UNBOUNDED FOLLOWING 表示到後面的終點
LAG(col,n): 往前第 n 行數據
LEAD(col,n): 往後第 n 行數據
NTILE(n): 把有序分區中的行分發到指定數據的組中, 各個組有編號, 編號從 1 開始,
對於每一行, NTILE 返回此行所屬的組的編號。 注意: n 必須爲 int 類型。

 

7.Rank
RANK() 排序相同時會重複, 總數不會變
DENSE_RANK()排序相同時會重複, 總數會減少
ROW_NUMBER() 會根據順序計算

 

 

 

 

 

 

 

 


 

 

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