Lateral View和表生成函数(例如Split、Explode等函数)结合使用,它能够将一行数据拆成多行数据,并对拆分后的数据进行聚合。
单个Lateral View语句
语法定义如下。
lateralView: LATERAL VIEW [OUTER] udtf(expression) tableAlias AS columnAlias (',' columnAlias) * fromClause: FROM baseTable (lateralView)*
Lateral view outer:当您定义的表生成函数不输出任何一行时,对应的输入行在Lateral View结果中依然保留,且所有表生成函数输出列为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”