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
...

首页