hive工作中用到的一些拼接函數。
一, concat(string s1, string s2, string s3)
這個函數能夠把字符串類型的數據連接起來,連接的某個元素可以是列值。
如 concat( aa, ‘:’, bb) 就相當於把aa列和bb列用冒號連接起來了,aa:bb。
二, cast
用法:cast(value as type)
功能:將某個列的值顯示的轉化為某個類型
例子:cast(age as string ) 將int類型的數據轉化為了String類型
三,Hive中collect相關的函數有collect_list和collect_set(列轉行)。
它們都是將分組中的某列轉為一個數組返回,不同的是collect_list不去重而collect_set去重。
collect_set(字段):根據某個字段分組后,把分在一組的數據合並在一起,默認分隔符’,’
這樣,就實現了將列轉行的功效,但是注意只限同列基本數據類型,函數只能接受一列參數。
collect_set(col)函數只接受基本數據類型,
它的主要作用是將某字段的值進行去重匯總,產生array類型字段。
select no,collect_set(score) from tablss group by no;
1
2
3
4
5
6
突破group by限制
還可以利用collect來突破group by的限制,Hive中在group by查詢的時候要求出現在select后面的列都必須是出現在group by后面的,即select列必須是作為分組依據的列,但是有的時候我們想根據A進行分組然后隨便取出每個分組中的一個B,代入到這個實驗中就是按照用戶進行分組,然后隨便拿出一個他看過的視頻名稱即可:
select username, collect_list(video_name)[0] from t_visit_video group by username;
1
video_name不是分組列,依然能夠取出這列中的數據。
四,concat_ws(seperator, string s1, string s2…)
功能:制定分隔符將多個字符串連接起來,實現“列轉行”(但常常結合group by與collect_set使用)
使用函數CONCAT_WS()。使用語法為:CONCAT_WS(separator,str1,str2,…)
CONCAT_WS() 代表 CONCAT With Separator ,是CONCAT()的特殊形式。第一個參數是其它參數的分隔符。分隔符的位置放在要連接的兩個字符串之間。分隔符可以是一個字符串,也可以是其它參數。如果分隔符為 NULL,則結果為 NULL。函數會忽略任何分隔符參數后的 NULL 值。但是CONCAT_WS()不會忽略任何空字符串。 (然而會忽略所有的 NULL)。
有表結構a string , b string , c int
數據為
c d 1
c d 2
c d 3
e f 4
e f 5
e f 6
想要得到
c d 1,2,3
e f 4,5,6
語句如下
select a, b, concat_ws(',' , collect_set(cast(c as string)))
from table group by a,b;
1
2
上述用的到的 collect_set 函數,有兩個作用,第一個是去重,去除group by后的重復元素,
第二個是形成一個集合,將group by后屬於同一組的第三列集合起來成為一個集合。與contact_ws
結合使用就是將這些元素以逗號分隔形成字符串
五,行轉列的函數。
1,explode()的功能是將一行數據轉換成列數據,可以用於array和map類型的數據。
用於array的語法如下:
select explode(arraycol) as newcol from tablename;
1
explode():函數中的參數傳入的是arrary數據類型的列名。
newcol:是給轉換成的列命名一個新的名字,用於代表轉換之后的列名。
tablename:原表名。
用於map的語法如下:
select explode(mapcol) as (keyname,valuename) from tablename;
1
explode():函數中的參數傳入的是map數據類型的列名。
由於map是kay-value結構的,所以它在轉換的時候會轉換成兩列,一列是kay轉換而成的,一列是value轉換而成的。
keyname:表示key轉換成的列名稱,用於代表key轉換之后的列名。
valuename:表示value轉換成的列名稱,用於代表value轉換之后的列名稱。
注意:這兩個值需要在as之后用括號括起來然后以逗號分隔。
以上為explode()函數的用法,此函數存在局限性:
其一:不能關聯原有的表中的其他字段。
其二:不能與group by、cluster by、distribute by、sort by聯用。
其三:不能進行UDTF嵌套。
其四:不允許選擇其他表達式。
2、lateral view
lateral view是Hive中提供給UDTF的結合,它可以解決UDTF不能添加額外的select列的問題。
lateral view其實就是用來和想類似explode這種UDTF函數聯用的,lateral view會將UDTF生成的結果放到一個虛擬表中,然后這個虛擬表會和輸入行進行join來達到連接UDTF外的select字段的目的。
格式一
lateral view udtf(expression) tableAlias as columnAlias (,columnAlias)*
lateral view在UDTF前使用,表示連接UDTF所分裂的字段。
UDTF(expression):使用的UDTF函數,例如explode()。
tableAlias:表示UDTF函數轉換的虛擬表的名稱。
columnAlias:表示虛擬表的虛擬字段名稱,如果分裂之后有一個列,則寫一個即可;如果分裂之后有多個列,按照列的順序在括號中聲明所有虛擬列名,以逗號隔開。
格式二
from basetable (lateral view)*
在from子句中使用,一般和格式一搭配使用,這個格式只是說明了lateral view的使用位置。
from子句后面也可以跟多個lateral view語句,使用空格間隔就可以了。
格式三
from basetable (lateral view outer)*
它比格式二只是多了一個outer,這個outer的作用是在UDTF轉換列的時候將其中的空也給展示出來,UDTF默認是忽略輸出空的,加上outer之后,會將空也輸出,顯示為NULL。這個功能是在Hive0.12是開始支持的。
注:
explode()及lateral view()函數詳解請見
https://blog.csdn.net/guodong2k/article/details/79459282
https://www.liangzl.com/get-article-detail-121725.html
https://blog.csdn.net/weixin_36630761/article/details/78416341