【轉】hive中的拼接函數contact,concat_ws,collect_set()及explode(),lateral view函數


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

相關連接:https://my.oschina.net/leejun2005/blog/120463


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM