場景:
hive有張表armmttxn_tmp,其中有一個(gè)字段lot_number,該字段以逗號分隔開多個(gè)值,每個(gè)值又以冒號來分割料號和數(shù)量,如:A3220089:-40,A3220090:-40,A3220091:-40,A3220083:-40,A3220087:-40,A3220086:-40,A3220088:-40,A3220084:-40,A3220081:-40,A3220082:-40,A3220092:-40,A3220093:-40,A3220085:-40,A3220094:-40。
要求:
把該字段拆分開來,并且把料號和數(shù)量單獨(dú)列出,也就是分成兩列。
原數(shù)據(jù):
select
key_id,
lot_number
from armmttxn_tmp
where key_id = '48641906';
用到的函數(shù):split()、explode()
?步驟:
step1:以逗號拆分開,如下:
["A3220089:-40","A3220090:-40","A3220091:-40","A3220083:-40","A3220087:-40","A3220086:-40","A3220088:-40","A3220084:-40","A3220081:-40","A3220082:-40","A3220092:-40","A3220093:-40","A3220085:-40","A3220094:-40"]
使用split函數(shù),把數(shù)據(jù)拆分開
select
key_id ,
split(lot_number, ',') lot_number
from armmttxn_tmp
where key_id = '48641906';
?step2:一行變成多行
select
explode(split(lot_number, ',')) lot_number
from armmttxn_tmp
where key_id = '48641906';
?這里如果加上key_id字段,會(huì)怎樣呢?
SQL 錯(cuò)誤 [10081] [42000]: Error while compiling statement: FAILED: SemanticException [Error 10081]: UDTF's are not supported outside the SELECT clause, nor nested in expressions
原因:當(dāng)使用UDTF函數(shù)的時(shí)候,hive只允許對拆分字段進(jìn)行訪問。
所以,可以這樣使用:select?explode(split(lot_number, ',')) lot_number from armmttxn_tmp where key_id = '48641906';?
但不可以這樣使用:select key_id ,explode(split(lot_number, ',')) lot_number from armmttxn_tmp where key_id = '48641906';
如果想訪問除了拆分字段以外 的字段,怎么辦呢?
用lateral view側(cè)視圖!
lateral view為側(cè)視圖,是為了配合UDTF來使用,把某一行數(shù)據(jù)拆分成多行數(shù)據(jù).不加lateral view的UDTF只能提取單個(gè)字段拆分,并不能塞會(huì)原來數(shù)據(jù)表中.加上lateral view就可以將拆分的單個(gè)字段數(shù)據(jù)與原始表數(shù)據(jù)關(guān)聯(lián)上.
注意:在使用lateral view的時(shí)候需要指定視圖別名
--表名 lateral view UDTF(xxx) 視圖別名(虛擬表名) as a,b,c(列別名)
--lateral view explode 相當(dāng)于一個(gè)拆分lot_number字段的虛表,然后與原表進(jìn)行關(guān)聯(lián).
step3:拆分的字段與原始表數(shù)據(jù)關(guān)聯(lián)上.
select
key_id ,
split(view.*,':') lot_number
from armmttxn_tmp lateral view explode(split(lot_number, ',')) view
where key_id = '48641906';
但還不是我們想要的最終結(jié)果,還需要把lot_number拆分成兩列文章來源:http://www.zghlxwxcb.cn/news/detail-770118.html
step4: 拆分成兩列
select
key_id ,
split(view.*,':')[size(split(view.*, ':'))-2] as lot_number,
split(view.*,':')[size(split(view.*, ':'))-1] as quantity
from armmttxn_tmp lateral view explode(split(lot_number, ',')) view
where key_id = '48641906';
文章來源地址http://www.zghlxwxcb.cn/news/detail-770118.html
到了這里,關(guān)于Hive行轉(zhuǎn)列[一行拆分成多行/一列拆分成多列]的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!