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之后用括号括起来然后以逗号分隔。
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://link.zhihu.com/?target=https%3A// cwiki.apache.org/confluence/display/Hive/LanguageManual%2BLateralView)
- https://msd.misuland.com/pd/307
- [https://cloud.tencent.com/developer/article/1437884]