hive生成表函数

172 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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 3posexplode({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,但是首列的内容不变。