1、explode
將一行數據轉換成列數據,可以用於array和map類型的數據。
就是將hive一行中複雜的array或者map結構拆分成多行。
- 用於
array
的語法如下:
select explode(arraycol) as newcol from tablename;
explode():函數中的參數傳入的是arrary數據類型的列名。
newcol:是給轉換成的列命名一個新的名字,用於代表轉換之後的列名。
tablename:原表名。
- 用於
map
的語法如下:
select explode(mapcol) as (keyname,valuename) from tablename;
explode():函數中的參數傳入的是map數據類型的列名。
由於map是kay-value結構的,所以它在轉換的時候會轉換成兩列,一列是kay轉換而成的,一列是value轉換而成的。
keyname:表示key轉換成的列名稱,用於代表key轉換之後的列名。
valuename:表示value轉換成的列名稱,用於代表value轉換之後的列名稱。
注意
:這兩個值需要在as之後用括號括起來然後以逗號分隔。
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是開始支持的。
參考:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+LateralView
https://msd.misuland.com/pd/3070888525579682904
https://cloud.tencent.com/developer/article/1437884