这些天使用 Hive 的过程中遇到了新的知识点,于是将 LATERAL VIEW 的使用方法记录下来。
UDTF
UDTF 是 User-Defined Table-Generating Functions 的缩写,即用户定义的表生成函数。UDTF 用来解决从原始表中的一行生成多行数据的问题。典型的 UDTF 有 EXPLODE 函数,它能将 array 或者 map 展开。例如:
考虑以下名为 pageAds 的原始表,它有两列:pageid(网页名称)和 adid_list(网页上显示的广告数组):
| 名称 | 类型 |
|---|---|
pageid |
STRING |
adid_list |
Array<int> |
假设其中有以下两行:
pageid |
adid_list |
|---|---|
contact_page |
[3, 4, 5] |
front_page |
[1, 2, 3] |
使用 EXPLODE 函数可以展开 adid_list 这一列,也就是说,SQL 语句的结果如下所示:
1 | SELECT |
不过,UDTF 有一个限制,它出现在 SELECT 子句中的时候,不能与其它列共同出现。也就是说下列 SQL 语句会报语法错误:
1 | SELECT |
为了解决这个问题,我们就需要引入 LATERAL VIEW。
LATERAL VIEW
LATERAL VIEW 的语法如下:
1 | -- lateralView: |
这里,udtf(expression) 表示诸如 EXPLODE 之类的 UDTF 的表达式。LATERAL VIEW 对遇到的每一行,首先会按 UDTF 表达式进行处理,展开成若干行(可能是零行),然后将这些输出行与输入行 INNER JOIN。如果要保留输出为零的行,则需使用 LATERAL VIEW OUTER 执行 OUTER JOIN。
继续以上述名为 pageAds 的原始表为例,为了同时 SELECT 出 pageid 和 adid,我们需要使用 LATERAL VIEW:
1 | SELECT |