前言
行专列,列转行是数开不可避免的一步,尤其是在最初接触Hive的时候,看到什么炸裂函数,各种udf,有点发憷,无从下手,时常产生这t怎么搞,我不会啊?
好吧,真正让你成长的,还得是甩给你一个需求,然后你自己绞尽脑汁的去实现。
Hive的STACK函数列转行原理
Hive中的STACK函数,可以将多个列转换为多行,每行包含两个值:第一个值是指定的列名,第二个值是该列的值。
stack(INT n, v1, v2, ..., vk)
-----把M列转换成N行,每行有M/N个字段,其中n必须是个常数
生产中的案例
我以我在sparksql开发过程中遇到的实例为例,简单介绍一下用法。
给一frame表:我这里只拿出一写字段和数据,不过足够演示了这个函数的用法了
+--------+--------+--------+--------+--------+
| fzl0000| fzl0100| fzl0200| max_fzl| fzl |
+--------+--------+--------+--------+--------+
| 0.9 | 0.8 | 0.7 | 0.6 | 0.5 |
+--------+--------+--------+--------+--------+
我要将上面的几列数据进行列转行,比较粗暴
HiveSQL代码
SELECT stack(4,'fzl0000', fzl0000,'fzl0100', fzl0100,'fzl0200', fzl0200,'max_fzl', max_fzl) AS (stat_time, mfzl)
FROM frame;
丢到集群跑程序然后我们得到的结果就出来
+--------------+------+
|stat_time | mfzl |
+--------------+------+
| fzl0000 | 0.9 |
| fzl0100 | 0.8 |
| fzl0200 | 0.7 |
| max_fzl | 0.6 |
+--------------+------+
注意,hue是不能直接跑这个代码的,impala也不行,会报错,所以还是老老实实写spark程序搞吧。
你也可以在stack函数里头做一些函数操作比如一些转换啊啥的,自己去找找吧。