Hive學習之Lateral View

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

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