Hive学习之Lateral View
Posted 浪尖聊大数据
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hive学习之Lateral View相关的知识,希望对你有一定的参考价值。
Lateral view与UDTF函数如explode()一起使用,UDTF对每个输入行产生0或者多个输出行。Lateral view首先在基表的每个输入行应用UDTF,然后连接结果输出行与输入行组成拥有指定表别名的虚拟表。Lateralview的语法如下:
LateralView: LATERAL VIEW udtf(expression) tableAlias AS columnAlias (',' columnAlias)*
fromClause: FROM baseTable (lateralView)*
在Hive-0.6.0之前,Lateral view不支持谓词下推优化,在Hive-0.5.0或者更早的版本中,如果查询中使用了WHERE子句,可能不会被编译,一个措施是在查询前将参数hive.optimize.ppd设置为false。在Hive-0.6.0中修复了该问题,UDTF不支持谓词下推。从Hive-0.12.0开始,可以省略列别名,在这种情况下,别名从UDTF返回的StructObjectInspector的域名继承而来。
下面通过例子来更好地理解Lateral view。假设存在下面的基表pageAds,该表有两列pageid(page的名称)和adid_list(page上出现的广告的数组):
列名称 |
列类型 |
pageid |
STRING |
adid_list |
Array<int> |
拥有两列的样例表如下,用户想统计出现在所有页面上的某个广告出现的总次数。
pageid |
adid_list |
front_page |
[1, 2, 3] |
contact_page |
[3, 4, 5] |
Lateral view结合explode()可以将adid_list转化为单独的行(explode函数将数组中的每个元素做为一行返回):
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子句,后面的LATERALVIEW可以引用出现在LATERAL VIEW左侧的任何表中的列,例如:
SELECT * FROM exampleTable
LATERAL VIEW explode(col1) myTable1 AS myCol1
LATERAL VIEW explode(myCol1) myTable2 AS myCol2;
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" |
从Hive-0.12.0开始,支持OUTER LATERALVIEW。当使用OUTRE关键字时可以再LATERAL VIEW不产生行时生成输出行。当UDTF不产生任何行时,比如explode()函数的输入列为空,LATERALVIEW就不会生成任何输出行。在这种情况下原有行永远不会出现在结果中。OUTRE可被用于阻止这种情况,输出行中来自UDTF的列将被设置为NULL。比如下面的语句将生成空的结果集:
SELEC * FROM src LATERAL VIEW explode(array()) C AS a limit 10;
但使用OUTER关键字后:
SELEC * FROM src LATERAL VIEW OUTRE explode(array()) C AS a limit 10;
输出的结果为:
238 |
val_238 |
NULL |
86 |
val_86 |
NULL |
311 |
val_311 |
NULL |
27 |
val_27 |
NULL |
推荐阅读:
以上是关于Hive学习之Lateral View的主要内容,如果未能解决你的问题,请参考以下文章
Hive:使用没有 LATERAL VIEW 的数组连接表爆炸
hive函数之~hive当中的lateral view 与 explode
Hive Lateral View + explode 详解