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 nameColumn type
pageidSTRING
adid_listArray<int>

有两行的示例表:

pageidadid_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 adidcount(1)
11
21
32
41
51

多个横向视图

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> col1Array<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 mycol1Array<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 myCol1string 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
...