Hive lateral view 和 explode的区别和使用

1、explode

将一行数据转换成列数据,可以用于array和map类型的数据。
就是将hive一行中复杂的array或者map结构拆分成多行。

  • 用于array的语法如下:

select explode(arraycol) as newcol from tablename;

explode():函数中的参数传入的是arrary数据类型的列名。
newcol:是给转换成的列命名一个新的名字,用于代表转换之后的列名。
tablename:原表名。

  • 用于map的语法如下:

select explode(mapcol) as (keyname,valuename) from tablename;

explode():函数中的参数传入的是map数据类型的列名。
由于map是kay-value结构的,所以它在转换的时候会转换成两列,一列是kay转换而成的,一列是value转换而成的。
keyname:表示key转换成的列名称,用于代表key转换之后的列名。
valuename:表示value转换成的列名称,用于代表value转换之后的列名称。
注意:这两个值需要在as之后用括号括起来然后以逗号分隔。

2、Lateral View

lateral view是Hive中提供给UDTF的结合,它可以解决UDTF不能添加额外的select列的问题。
lateral view其实就是用来和想类似explode这种UDTF函数联用的,lateral view会将UDTF生成的结果放到一个虚拟表中,然后这个虚拟表会和输入行进行join来达到连接UDTF外的select字段的目的。

  • 格式一

lateral view udtf(expression) tableAlias as columnAlias (,columnAlias)*

lateral view在UDTF前使用,表示连接UDTF所分裂的字段。
UDTF(expression):使用的UDTF函数,例如explode()。
tableAlias:表示UDTF函数转换的虚拟表的名称。
columnAlias:表示虚拟表的虚拟字段名称,如果分裂之后有一个列,则写一个即可;如果分裂之后有多个列,按照列的顺序在括号中声明所有虚拟列名,以逗号隔开。

  • 格式二

from basetable (lateral view)*

在from子句中使用,一般和格式一搭配使用,这个格式只是说明了lateral view的使用位置。
from子句后面也可以跟多个lateral view语句,使用空格间隔就可以了。

  • 格式三

from basetable (lateral view outer)*

它比格式二只是多了一个outer,这个outer的作用是在UDTF转换列的时候将其中的空也给展示出来,UDTF默认是忽略输出空的,加上outer之后,会将空也输出,显示为NULL。这个功能是在Hive0.12是开始支持的。

参考:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+LateralView
https://msd.misuland.com/pd/3070888525579682904
https://cloud.tencent.com/developer/article/1437884

发布了52 篇原创文章 · 获赞 85 · 访问量 6681

猜你喜欢

转载自blog.csdn.net/qq_39783601/article/details/105166731