Lateral View
更新时间:2019-02-13 11:56:02
Lateral View和split,explode等UDTF一起使用,它能够将一行数据拆成多行数据,并在此基础上对拆分后的数据进行聚合。
单个Lateral View语句
语法定义如下:
lateralView: LATERAL VIEW [OUTER] udtf(expression) tableAlias AS columnAlias (',' columnAlias) * fromClause: FROM baseTable (lateralView)*
说明如下:
- Lateral view outer:当table function不输出任何一行时,对应的输入行在Lateral view结果中依然保留,且所有table function输出列为null。
示例如下:
假设我们有一张表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;
执行结果如下:
string pageid int adid “front_page” 1 “front_page” 2 “front_page” 3 “contact_page” 3 “contact_page” 4 “contact_page” 5 - 进行聚合的统计,语句如下:
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
多个Lateral View语句
一个from语句后可以跟多个Lateral View语句,后面的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” 来源: https://help.aliyun.com/document_detail/87722.html?spm=a2c4g.11186623.2.9.41a11230wnHcpj