Lateral view與UDTF函數如explode()一起使用,UDTF對每個輸入行產生0或者多個輸出行。Lateral view首先在基表的每個輸入行應用UDTF,然後連接結果輸出行與輸入行組成擁有指定表別名的虛擬表。Lateralview的語法如下:
LateralView: LATERAL VIEW udtf(expression) tableAlias AS columnAlias (',' columnAlias)* fromClause: FROM baseTable (lateralView)*
在Hive-0.6.0之前,Lateral view不支持謂詞下推優化,在Hive-0.5.0或者更早的版本中,如果查詢中使用了WHERE子句,可能不會被編譯,一個措施是在查詢前將參數hive.optimize.ppd設置爲false。在Hive-0.6.0中修復了該問題,UDTF不支持謂詞下推。從Hive-0.12.0開始,可以省略列別名,在這種情況下,別名從UDTF返回的StructObjectInspector的域名繼承而來。
下面通過例子來更好地理解Lateral view。假設存在下面的基表pageAds,該表有兩列pageid(page的名稱)和adid_list(page上出現的廣告的數組):
列名稱 | 列類型 |
---|---|
pageid | STRING |
adid_list | Array<int> |
擁有兩列的樣例表如下,用戶想統計出現在所有頁面上的某個廣告出現的總次數。
pageid | adid_list |
---|---|
front_page | [1, 2, 3] |
contact_page | [3, 4, 5] |
Lateral view結合explode()可以將adid_list轉化爲單獨的行(explode函數將數組中的每個元素做爲一行返回):
SELECT pageid, adid FROM pageAds LATERAL VIEW explode(adid_list) adTable AS adid;
輸出的結果爲:
pageid (string) | adid (int) |
---|---|
"front_page" | 1 |
"front_page" | 2 |
"front_page" | 3 |
"contact_page" | 3 |
"contact_page" | 4 |
"contact_page" | 5 |
要統計特定廣告的出現次數,可以使用count和group by:
SELECT adid, count(1) FROM pageAds LATERAL VIEW explode(adid_list) adTable AS adid GROUP BY adid;
輸出結果爲:
int adid | count(1) |
---|---|
1 | 1 |
2 | 1 |
3 | 2 |
4 | 1 |
5 | 1 |
FROM子句可以有多個LATERAL VIEW子句,後面的LATERALVIEW可以引用出現在LATERAL VIEW左側的任何表中的列,例如:
SELECT * FROM exampleTable LATERAL VIEW explode(col1) myTable1 AS myCol1 LATERAL VIEW explode(myCol1) myTable2 AS myCol2;
LATERAL VIEW子句按照出現的順序依次使用,例如存在下面的基表:
Array<int> col1 | Array<string> col2 |
---|---|
[1, 2] | [a", "b", "c"] |
[3, 4] | [d", "e", "f"] |
下面的查詢:
SELECT myCol1, col2 FROM baseTable LATERAL VIEW explode(col1) myTable1 AS myCol1;
輸出的結果爲:
int mycol1 | Array<string> col2 |
---|---|
1 | [a", "b", "c"] |
2 | [a", "b", "c"] |
3 | [d", "e", "f"] |
4 | [d", "e", "f"] |
再增加一個LATERAL VIEW後的查詢語句爲:
SELECT myCol1, myCol2 FROM baseTable LATERAL VIEW explode(col1) myTable1 AS myCol1 LATERAL VIEW explode(col2) myTable2 AS myCol2;
輸出的結果爲:
int myCol1 | string myCol2 |
---|---|
1 | "a" |
1 | "b" |
1 | "c" |
2 | "a" |
2 | "b" |
2 | "c" |
3 | "d" |
3 | "e" |
3 | "f" |
4 | "d" |
4 | "e" |
4 | "f" |
從Hive-0.12.0開始,支持OUTER LATERALVIEW。當使用OUTRE關鍵字時可以再LATERAL VIEW不產生行時生成輸出行。當UDTF不產生任何行時,比如explode()函數的輸入列爲空,LATERALVIEW就不會生成任何輸出行。在這種情況下原有行永遠不會出現在結果中。OUTRE可被用於阻止這種情況,輸出行中來自UDTF的列將被設置爲NULL。比如下面的語句將生成空的結果集:
SELEC * FROM src LATERAL VIEW explode(array()) C AS a limit 10;
但使用OUTER關鍵字後:
SELEC * FROM src LATERAL VIEW OUTRE explode(array()) C AS a limit 10;
輸出的結果爲:
238 | val_238 | NULL |
---|---|---|
86 | val_86 | NULL |
311 | val_311 | NULL |
27 | val_27 | NULL |
原文地址:https://blog.csdn.net/skywalker_only/article/details/39289709