Hive lateral view 和 explode的區別和使用

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章