hive中如何进行行转列呢?
我们先创建一个表,并初始化一些数据进去
mysql 代码:CREATE TABLEtest(
name STRING COMMENT '姓名',
subject STRING COMMENT '主题',
score INT COMMENT '分数'
) COMMENT '测试表' ;
INSERT INTO test values('张三','语文',100),('李四','语文',90),('张三','数学',80),('李四','数学',80);
可以看到现在表test中的数据是这样的
现在我们用name进行分组,然后把subject的语文、数学变成列,再将score变成语文、数学列的值。
mysql 代码: SELECT name
,concat_ws('-',collect_list(if(subject = '语文',CAST(score as STRING),null))) as `语文`
,concat_ws('-',collect_list(if(subject = '数学',CAST(score as STRING),null))) as `数学`
FROM test
GROUP BY name
再看一下效果
其中涉及到几个函数
concat_ws
concat_ws函数需要传入2个参数,第一个参数为拼接字符串,第二个参数为需要拼接的列名集合,需要注意的是,如果集合中存在null则会被忽略,利用这一点我们可以把多行的同一列数据拼接成一个字段,形成列转行。
IF
if 函数用来判断条件然后返回内容,第一个参数是条件,第二个参数是条件true时返回的内容,第三个参数是条件false时返回的内容。配合concat_ws函数忽略null的特性,可以用来指定返回那一行的值,例如
mysql 代码:if(subject = '语文',CAST(score as STRING),null)
则只会返回语文那一行的数据
CAST
这是一个转换函数,因为concat_ws后的列需要一个string类型,所以将score从int转为string