持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情
我们知道在hive中创建表使用到的是create table xxx,还有这样的生成表函数,那就是explode(a),stack()以及json_tuple()等等。
首先介绍一下explode(),这是在这一种生成表函数中比较常见的了,并且也是非常有用的函数,他的作用是可以将数组或者map炸裂出来。
下面详细介绍一下使用方法。
常见使用方法: explode(a)
具体功能描述: 首先这里的a可以是一个数组或者是map,将数据炸裂成多行,如果应用在array数组中进行数据炸裂,得到的结果是个多行的表数据,每一行对应到的就是array中的一个元素。应用在map中的话,每行对应每个map键-值,其中一个字段是map的键,另一个字段是map的值。
explode(array('张三','lisi','王wu'))
OK
>> 张三
lisi
王wu
explode({name:'张三',english_name:'lisi',age:33})
OK
>> name 张三
english_name lisi
age 33
与explode 相类似的还有posexplode,会同时返回元素所在的位置,返回的结果也是一个有n行数据的表。
下面看一下具体的实例。
posexplode(array('张三','lisi','王wu'))
OK
>> 张三 1
lisi 2
王wu 3
posexplode({name:'张三',english_name:'lisi',age:33})
OK
>> name 张三 1
english_name lisi 2
age 33 3
再介绍一个stack()函数,稍微有点点复杂,但也不是很麻烦,主要是理解进去其中的使用含义,实现方式。
先来看下使用方法stack(int a,T1 V1,...,Tn/r Vn)
具体功能描述: 将n行数据进行切割,分为a列的数据,此处a需要是一个常量数据,没有行则是有n/a列,比如stack(int 3,T1 V1,...,Tn/r V9),这样最终结果就是有3列。
id ca cb cc
1 c_a1 c_b1 c_c1
2 c_a2 c_b2 c_c2
select stack(3,"ca",ca,"cb",cb,"cc",cc) from t_table_test;
就会输出:
第一列 第二列
ca c_a1
cb c_b1
cc c_c1
ca c_a2
cb c_b2
cc c_c2
-- 对六行数据进行转列,每一行的数据都有两列,这个两列就是通过 6/3得到的,因为这里获取的还是表中的数据,所以就会扩展到6行,指定的表数据有6,但是首列的内容不变。