lateralView: LATERAL VIEW udtf(expression) tableAlias AS columnAlias (',' columnAlias)*
fromClause: FROM baseTable (lateralView)*
Lateral View一般與用戶自定義表生成函數(如explode())結合使用。 如內置表生成函數中所述,UDTF為每個輸入行生成零個或多個輸出行。 Lateral View 首先將UDTF應用于基表的每一行,然后將結果輸出行連接到輸入行,以形成具有提供的表別名的虛擬表。
在Hive 0.6.0之前,Lateral View 不支持謂詞下推優化。
在Hive 0.5.0和更早版本中,如果你使用WHERE子句,你的查詢如果沒有沒有編譯。
解決方法是在你查詢之前添加 set hive.optimize.ppd = false 。
這個問題是在Hive 0.6.0中進行修復的, 請參閱https://issues.apache.org/jira/browse/HIVE-1056。
從Hive 0.12.0中,可以省略列別名。
在這種情況下,別名繼承自從UTDF返回的StructObjectInspector的字段名稱。
考慮以下名為pageAds的基表。 它有兩列:pageid(網頁名稱)和adid_list(網頁上顯示的廣告數組):
而且用戶希望統計廣告在所有網頁上展示的總次數。
Lateral View 與 explode()函數 結合使用可以將adid_list轉換為單獨的行:
hive> SELECT pageid, adid> FROM tmp_laterview LATERAL VIEW explode(adid_list) adTable AS adid;OKfront_page 1front_page 2front_page 3contact_page 3contact_page 4contact_page 5Time taken: 0.132 seconds, Fetched: 6 row(s)
然后,為了計算特定廣告的展示次數,使用如下命令:
hive> SELECT adid, count(1)> FROM tmp_laterview LATERAL VIEW explode(adid_list) adTable AS adid> GROUP BY adid;OK
1 1
2 1
3 2
4 1
5 1
Time taken: 11.456 seconds, Fetched: 5 row(s)
FROM子句可以有多個LATERAL VIEW子句。 后面的LATERAL VIEWS子句可以引用出現在LATERAL VIEWS左側表的任何列。
例如,如下查詢:
SELECT * FROM exampleTable
LATERAL VIEW explode(col1) myTable1 AS myCol1
LATERAL VIEW explode(col2) myTable2 AS myCol2;
LATERAL VIEW子句按照它們出現的順序應用。 例如使用以下基表:
單個Lateral View查詢
hive> SELECT pageid_list, adid > FROM tmp_laterview> LATERAL VIEW explode(adid_list) adTable AS adid;
OK
[1,2,3] a
[1,2,3] b
[1,2,3] c
[4,5] c
[4,5] d
多個Lateral View查詢:
hive> SELECT pageid, adid > FROM tmp_laterview> LATERAL VIEW explode(adid_list) adTable AS adid> LATERAL VIEW explode(pageid_list) adTable AS pageid;
OK
1 a
2 a
3 a
1 b
2 b
3 b
1 c
2 c
3 c
4 c
5 c
4 d
5 d
在Hive0.12.0版本后引入
用戶可以指定可選的OUTER關鍵字來生成行,即使LATERAL VIEW通常不會生成行。當所使用的UDTF不產生任何行時(使用explode()函數時,explode的列為空時,很容易發生上述這種情況)。 在這種情況下,源數據行不會出現在結果中。如果想讓源數據行繼續出現在結果中,可以使用 OUTER可以用來阻止關鍵字,并且來自UDTF的列使用NULL值代替。
例如,以下查詢返回空結果:
hive> SELECT * FROM tmp_laterview LATERAL VIEW explode(array()) C AS a;
OK
Time taken: 0.077 seconds
但是使用OUTER關鍵詞:
hive> SELECT * FROM tmp_laterview LATERAL VIEW OUTER explode(array()) C AS a;
OK
[1,2,3] ["a","b","c"] NULL
[4,5] ["c","d"] NULL
Time taken: 0.053 seconds, Fetched: 2 row(s)
原文:https://blog.csdn.net/SunnyYoona/article/details/62894761
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态