短連結生成例項
常用的內建函式
空欄位賦值
NVL:給值為NULL的資料賦值,格式:NVL(value,default_value)。
(如果value為NULL,則NVL函式返回default_value的值,否則返回value的值,如果兩個引數都為NULL,則返回NULL。)
select comm, nvl(comm, -1) from emp;
# comm的資料為空的 用-1填充
comm _c1
NULL -1.0
300.0 300.0
500.0 500.0
NULL -1.0
1400.0 1400.0
NULL -1.0
select comm, nvl(comm, mgr) from emp;
# comm的資料為空的 用mgr資料填充
comm _c1
NULL 7902.0
300.0 300.0
500.0 500.0
NULL 7839.0
1400.0 1400.0
NULL 7839.0
行轉列
CONCAT(string a/col, string b/col……):返回輸入字串連線後的結果,支援任意個輸入字串
CONCAT_WS(separator,st1,st2,…):一個特殊形式的CONCAT()。separator其他引數之間的分隔符
(分隔符可以是與剩餘引數一樣的字串。如果分隔符是 NULL,返回值也將為 NULL。這個函式會跳過分隔符引數後的任何 NULL 和空字串。分隔符將被加到被連線的字串之間;)
COLLECT_SET(col):函式只接受
select t1.base, concat_ws('|', collect_set(t1.name)) name from (select name, concat(constellation, ",", blood_type) base from person_info) t1 group by t1.base;
列轉行
EXPLODE(col):將hive一列中複雜的array或者map結構拆分成多行。
LATERAL VIEW
(LATERAL VIEWudtf(expression) tableAlias AS columnAlias)
(用於和split, explode等UDTF一起使用,它能夠將一列資料拆成多行資料,在此基礎上可以對拆分後的資料進行聚合。)
select m.movie, tbl.cate from movie_info m lateral view explode(split(category, ",")) tbl as cate;
開窗函式:
- OVER():指定分析函式工作的資料視窗大小,這個資料視窗大小可能會隨著行的變而變化。
- CURRENT ROW:當前行
- nPRECEDING:往前n行資料
- nFOLLOWING:往後n行資料
- UNBOUNDED:起點,UNBOUNDED PRECEDING 表示從前面的起點, UNBOUNDEDFOLLOWING表示到後面的終點
- LAG(col,n,default_val):往前第n行資料
- LEAD(col,n, default_val):往後第n行資料
- NTILE(n):把有序視窗的行分發到指定資料的組中,各個組有編號,編號從1開始,對於每一行,NTILE返回此行所屬的組的編號。注意:n必須為int型別。
#查詢在2017年4月份購買過的顧客及總人數 select name,count(*) over () from business where substring(orderdate,1,7) = '2017-04' group by name; #查詢顧客的購買明細及月購買總額 select name,orderdate,cost,sum(cost) over(partition by month(orderdate)) from business; #上述的場景, 將每個顧客的cost按照日期進行累加 select name,orderdate,cost, sum(cost) over() as sample1,--所有行相加 sum(cost) over(partition by name) as sample2,--按name分組,組內資料相加 sum(cost) over(partition by name order by orderdate) as sample3,--按name分組,組內資料累加 sum(cost) over(partition by name order by orderdate rows between UNBOUNDED PRECEDING and current row ) as sample4 ,--和sample3一樣,由起點到當前行的聚合 sum(cost) over(partition by name order by orderdate rows between 1 PRECEDING and current row) as sample5, --當前行和前面一行做聚合 sum(cost) over(partition by name order by orderdate rows between 1 PRECEDING AND 1 FOLLOWING ) as sample6,--當前行和前邊一行及後面一行 sum(cost) over(partition by name order by orderdate rows between current row and UNBOUNDED FOLLOWING ) as sample7 --當前行及後面所有行 from business; #檢視顧客上次的購買時間 select name,orderdate,cost, lag(orderdate,1,'1900-01-01') over(partition by name order by orderdate ) as time1, lag(orderdate,2) over (partition by name order by orderdate) as time2 from business; #查詢前20%時間的訂單資訊 select * from ( select name,orderdate,cost, ntile(5) over(order by orderdate) sorted from business ) t where sorted = 1;
排序函式:
- RANK() 排序相同時會重複,總數不會變
- DENSE_RANK() 排序相同時會重複,總數會減少
- ROW_NUMBER() 會根據順序計算
select name,subject,score, rank() over(partition by subject order by score desc) rp, dense_rank() over(partition by subject order by score desc) drp, row_number() over(partition by subject order by score desc) rmp from score;
日期相關函式:
current_date返回當前日期
date_add, date_sub 日期的加減
--date_add, date_sub 日期的加減 --今天開始90天以後的日期 select date_add(current_date(), 90); --今天開始90天以前的日期 select date_sub(current_date(), 90); --兩個日期之間的日期差 --今天和1990年6月4日的天數差 SELECT datediff(CURRENT_DATE(), "1990-06-04");
自定義函式
- Hive 自帶了一些函式,比如:max/min等,但是數量有限,自己可以通過自定義UDF來方便的擴充套件。
- 當Hive提供的內建函式無法滿足你的業務處理需要時,此時就可以考慮使用使用者自定義函式(UDF:user-defined function)。
- 根據使用者自定義函式類別分為以下三種:
(1)UDF(User-Defined-Function)一進一出
(2)UDAF(User-Defined Aggregation Function)聚集函式,多進一出【類似於:count/max/min】
(3)UDTF(User-Defined Table-Generating Functions)一進多出 【如lateral view explore()】