lateral view用于和split, explode等UDTF一起使用,它能夠将一列資料拆成多行資料,在此基礎上可以對拆分後的資料進行聚合。
一個簡單的例子,假設我們有一張表pageAds,它有兩列資料,第一列是pageid string,第二列是adid_list,即用逗号分隔的廣告ID集合:
string pageid | Array<int> adid_list |
"front_page" | [1, 2, 3] |
"contact_page" | [3, 4, 5] |
要統計所有廣告ID在所有頁面中出現的次數。
首先分拆廣告ID:
SELECT pageid, adid
FROM pageAds LATERAL VIEW explode(adid_list) adTable AS adid;
執行結果如下:
int adid | |
1 | |
2 | |
3 | |
4 | |
5 |
接下來就是一個聚合的統計:
SELECT adid, count(1)
FROM pageAds LATERAL VIEW explode(adid_list) adTable AS adid
GROUP BY adid;
結果如下:
count(1) | |
多個lateral view語句: 一個FROM語句後可以跟多個lateral view語句,後面的lateral view語句能夠引用它前面的所有表和列名。 以下面的表為例:
Array<int> col1 | Array<string> col2 |
[1, 2] | [a", "b", "c"] |
[3, 4] | [d", "e", "f"] |
的執行結果為:
int mycol1 | |
加上一個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 |
"a" | |
"b" | |
"c" | |
"d" | |
"e" | |
"f" | |
注意上面語句中,兩個lateral view按照出現的次序被執行。
大多數人都以為是才智成就了科學家,他們錯了,是品格。---愛因斯坦