On this page
LanguageManual LateralView
横向视图语法
lateralView: LATERAL VIEW udtf(expression) tableAlias AS columnAlias (',' columnAlias)*
fromClause: FROM baseTable (lateralView)*
Description
横向视图与用户定义的表生成功能(例如explode()
)结合使用。如内置表生成功能中所述,UDTF 为每个 Importing 行生成零个或多个输出行。侧视图首先将 UDTF 应用于基础表的每一行,然后将结果输出行与 Importing 行连接起来以形成具有所提供表别名的虚拟表。
Version
在 Hive 0.6.0 之前,侧视图不支持谓词下推优化。在 Hive 0.5.0 及更早版本中,如果使用 WHERE 子句,则查询可能尚未编译。一种解决方法是在查询之前添加set hive.optimize.ppd=false;
。该修复程序在 Hive 0.6.0 中进行;参见https://issues.apache.org/jira/browse/HIVE-1056:谓词下推不适用于 UDTF。
Version
从 Hive 0.12.0 起,可以省略列别名。在这种情况下,别名将从从 UTDF 返回的 StructObjectInspector 的字段名称继承。
Example
考虑以下名为pageAds
的基本表。它有两列:pageid
(页面名称)和adid_list
(页面上显示的广告数组):
Column name | Column type |
---|---|
pageid | STRING |
adid_list | Array<int> |
有两行的示例表:
pageid | adid_list |
---|---|
front_page | [1, 2, 3] |
contact_page | [3, 4, 5] |
并且用户希望计算广告在所有页面上展示的总次数。
带有explode()的侧面视图可用于通过查询将adid_list
转换为单独的行:
SELECT pageid, adid
FROM pageAds LATERAL VIEW explode(adid_list) adTable AS adid;
结果输出将是
pageid (string) | adid (int) |
---|---|
"front_page" | 1 |
"front_page" | 2 |
"front_page" | 3 |
"contact_page" | 3 |
"contact_page" | 4 |
"contact_page" | 5 |
然后,为了计算特定广告的展示次数,可以使用 count/group by:
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 |
多个横向视图
FROM 子句可以具有多个 LATERAL VIEW 子句。随后的 LATERAL VIEWS 可以引用 LATERAL VIEW 左侧出现的任何表中的列。
例如,以下可能是有效的查询:
SELECT * FROM exampleTable
LATERAL VIEW explode(col1) myTable1 AS myCol1
LATERAL VIEW explode(myCol1) myTable2 AS myCol2;
LATERAL VIEW 子句按它们出现的 Sequences 应用。例如,下面的基本表:
Array<int> col1 | Array<string> col2 |
[1, 2] | [a", "b", "c"] |
[3, 4] | [d", "e", "f"] |
The query:
SELECT myCol1, col2 FROM baseTable
LATERAL VIEW explode(col1) myTable1 AS myCol1;
Will produce:
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;
Will produce:
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" |
外部横向视图
Version
在 Hive 版本 0.12.0 中引入
即使LATERAL VIEW
通常不会生成行,用户也可以指定可选的OUTER
关键字来生成行。当要使用的 UDTF 不会生成任何行时,如果要爆炸的列为空,则使用explode
会很容易发生这种情况。在这种情况下,源行将永远不会出现在结果中。 OUTER
可用于防止这种情况,并且将使用来自 UDTF 的列中的NULL
值生成行。
例如,以下查询返回空结果:
SELEC * FROM src LATERAL VIEW explode(array()) C AS a limit 10;
但是使用OUTER
关键字
SELECT * FROM src LATERAL VIEW OUTER explode(array()) C AS a limit 10;
它会产生:
238 val_238 NULL
86 val_86 NULL
311 val_311 NULL
27 val_27 NULL
165 val_165 NULL
409 val_409 NULL
255 val_255 NULL
278 val_278 空
98 val_98 NULL
...