1. 程式人生 > 實用技巧 >短連結生成例項

短連結生成例項

常用的內建函式

空欄位賦值

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):函式只接受

基本資料型別,它的主要作用是將某欄位的值進行去重彙總,產生array型別欄位。

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, explodeUDTF一起使用它能夠將一列資料拆成多行資料在此基礎上可以對拆分後的資料進行聚合。)

select
    m.movie,
    tbl.cate
from
    movie_info m
lateral view
    explode(split(category, ",")) tbl as cate;

窗函式

  1. OVER()指定分析函式工作的資料視窗大小,這個資料視窗大小可能會隨著行的變而變化。
  2. CURRENT ROW:當前行
  3. nPRECEDING:往前n行資料
  4. nFOLLOWING:往後n行資料
  5. UNBOUNDED:起點,UNBOUNDED PRECEDING 表示從前面的起點, UNBOUNDEDFOLLOWING表示到後面的終點
  6. LAG(col,n,default_val):往前第n行資料
  7. LEAD(col,n, default_val):往後第n行資料
  8. 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;

排序函式:

  1. RANK() 排序相同時會重複,總數不會變
  2. DENSE_RANK() 排序相同時會重複,總數會減少
  3. 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");

自定義函式

  1. Hive 自帶了一些函式比如max/min但是數量有限自己可以通過自定義UDF來方便的擴充套件。
  2. Hive提供的內建函式無法滿足你的業務處理需要時此時就可以考慮使用使用者自定義函式UDFuser-defined function
  3. 根據使用者自定義函式類別分為以下三種:

1UDFUser-Defined-Function一進一出

2UDAFUser-Defined Aggregation Function聚集函式多進一出類似於:count/max/min

3UDTFUser-Defined Table-Generating Functions一進多出 【lateral view explore()】