1. 程式人生 > 其它 >Hive中除了視窗函式外的常用函式:casewhen,行轉列,列轉行

Hive中除了視窗函式外的常用函式:casewhen,行轉列,列轉行

技術標籤:hive

一、關於使用函式的一些小方法

  1. 顯示系統自帶所有函式
    show functions;
  2. 描述指定函式的作用
    desc function 函式名;
  3. 描述函式的詳情資訊(一般是都是有例子的)
    desc function extended 函式名;

二、函式NVL,相當於mysql中的lfnull
格式:NVL(列表名,用來替換null的值)

三、case when
格式:
case 列表名 when 表中的一個值 then 替代他的值 else 另外一個值 end
總體類似於三元運算子
如一列性別的資料均為男女,可以改寫為
sum(case sex when ‘男’ then 1 else 0 end) male_count,

sum(case sex when ‘女’ then 1 else 0 end) female_count
用來分別計算男女數目

四,行轉列,連線多列變成一列
concat
1,select concat(empno,’-’,ename,’-’,sal,’-’,deptno) from emp; 可以自己設定連線符

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

注意:CONCAT_WS must be “string or array”

3,collect_set(對結果集去重):函式只接受基本資料型別,它的主要作用是將某欄位的值進行去重彙總,產生array型別欄位。
collect_list(不對結果集去重):函式只接受基本資料型別,它的主要作用是將某欄位的值進行不去重彙總,產生array型別欄位。
注,是對某欄位

可以通過collect_set或者collect_list產生string陣列來配合concat_ws 使用

當我們對一個東西分組時,只能計算它的聚合函式
如,我們對部門分組,可以通過count(*)直接計算部門總人數,這時可以通過collect對分組後的一個部門將其資料轉化為一個數組

舉例:
在這裡插入圖片描述
在這裡插入圖片描述
四,列轉行

Split(str, separator):將字串按照後面的分隔符切割,轉換成字元array。
EXPLODE(col):將hive一列中複雜的array或者map結構拆分成多行。
比如一個數據:懸疑,動作,科幻,劇情
我們可以通過split將其轉化為陣列,再將陣列變成行

explode(split(category,","))

變成在這裡插入圖片描述
lateral view首先為原始表的每行呼叫UDTF,UDTF會把一行拆分成一或者多行,lateral view再把結果組合,產生一個支援別名表的虛擬表。