当前位置:   article > 正文

Hive Lateral View使用指南

hive lateral view

1. 语法

lateralView: LATERAL VIEW udtf(expression) tableAlias AS columnAlias (',' columnAlias)*
fromClause: FROM baseTable (lateralView)*
  • 1
  • 2

2. 描述

Lateral View一般与用户自定义表生成函数(如explode())结合使用。 如内置表生成函数中所述,UDTF为每个输入行生成零个或多个输出行。 Lateral View 首先将UDTF应用于基表的每一行,然后将结果输出行连接到输入行,以形成具有提供的表别名的虚拟表。

在Hive 0.6.0之前,Lateral View 不支持谓词下推优化。 
在Hive 0.5.0和更早版本中,如果你使用WHERE子句,你的查询如果没有没有编译。
解决方法是在你查询之前添加 set hive.optimize.ppd = false 。 
这个问题是在Hive 0.6.0中进行修复的, 请参阅https://issues.apache.org/jira/browse/HIVE-1056。
  • 1
  • 2
  • 3
  • 4
从Hive 0.12.0中,可以省略列别名。
在这种情况下,别名继承自从UTDF返回的StructObjectInspector的字段名称。
  • 1
  • 2

3. Example

考虑以下名为pageAds的基表。 它有两列:pageid(网页名称)和adid_list(网页上显示的广告数组):
在这里插入图片描述

而且用户希望统计广告在所有网页上展示的总次数。

Lateral View 与 explode()函数 结合使用可以将adid_list转换为单独的行:

	hive> SELECT pageid, adid
	    > FROM tmp_laterview LATERAL VIEW explode(adid_list) adTable AS adid;
	OK
	front_page	1
	front_page	2
	front_page	3
	contact_page	3
	contact_page	4
	contact_page	5
	Time taken: 0.132 seconds, Fetched: 6 row(s)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

然后,为了计算特定广告的展示次数,使用如下命令:

hive> SELECT adid, count(1)
    > FROM tmp_laterview LATERAL VIEW explode(adid_list) adTable AS adid
    > GROUP BY adid;
 
OK
1	1
2	1
3	2
4	1
5	1
Time taken: 11.456 seconds, Fetched: 5 row(s)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

4. Multiple Lateral Views

FROM子句可以有多个LATERAL VIEW子句。 后面的LATERAL VIEWS子句可以引用出现在LATERAL VIEWS左侧表的任何列。

例如,如下查询:

SELECT * FROM exampleTable
LATERAL VIEW explode(col1) myTable1 AS myCol1
LATERAL VIEW explode(col2) myTable2 AS myCol2;
  • 1
  • 2
  • 3

LATERAL VIEW子句按照它们出现的顺序应用。 例如使用以下基表:

单个Lateral View查询

hive> SELECT pageid_list, adid 
    > FROM tmp_laterview
    > LATERAL VIEW explode(adid_list) adTable AS adid;
OK
[1,2,3]	a
[1,2,3]	b
[1,2,3]	c
[4,5]	c
[4,5]	d
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

多个Lateral View查询:

hive> SELECT pageid, adid 
    > FROM tmp_laterview
    > LATERAL VIEW explode(adid_list) adTable AS adid
    > LATERAL VIEW explode(pageid_list) adTable AS pageid;
OK
1	a
2	a
3	a
1	b
2	b
3	b
1	c
2	c
3	c
4	c
5	c
4	d
5	d
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

5. Outer Lateral Views

在Hive0.12.0版本后引入
  • 1

用户可以指定可选的OUTER关键字来生成行,即使LATERAL VIEW通常不会生成行。当所使用的UDTF不产生任何行时(使用explode()函数时,explode的列为空时,很容易发生上述这种情况)。 在这种情况下,源数据行不会出现在结果中。如果想让源数据行继续出现在结果中,可以使用 OUTER可以用来阻止关键字,并且来自UDTF的列使用NULL值代替。

例如,以下查询返回空结果:

hive> SELECT * FROM tmp_laterview LATERAL VIEW explode(array()) C AS a;
OK
Time taken: 0.077 seconds
  • 1
  • 2
  • 3

但是使用OUTER关键词:

hive> SELECT * FROM tmp_laterview LATERAL VIEW OUTER explode(array()) C AS a;
OK
[1,2,3]	["a","b","c"]	NULL
[4,5]	["c","d"]	NULL
Time taken: 0.053 seconds, Fetched: 2 row(s)
  • 1
  • 2
  • 3
  • 4
  • 5

原文:https://blog.csdn.net/SunnyYoona/article/details/62894761

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/722712
推荐阅读
相关标签
  

闽ICP备14008679号