hive有经典的列转行,但行转列也不应该忽略

一、行转列

行转列:将多个列中的数据在一列中输出
列转行:将某列一行中的数据拆分成多行

1、concat

concat(string1/col, string2/col, …)

输入任意个字符串(或字段,可以为int类型等),返回拼接后的结果

select concat(id,'-',name,'-',age) 
from student;

2、Concat_ws

concat_ws(separator, str1, str2, …)

特殊形式的 concat(),参数只能为字符串,第一个参数为后面参数的分隔符

分隔符可以是与后面参数一样的字符串。如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间;

select concat_ws('-', name, gender) 
from student;



3、collect_set(聚合,返回数组类型)

collect_set(col)

将某字段进行去重处理,返回array类型;该函数只接受基本数据类型

select collect_set(age) 
from student;

4、同理,collect_list

collect_set 与 collect_list 的区别就是set去重,list不去重

5、行转列常用函数还有 case when

case when then …else end
if(expr, true_result, false_result)


case when 语句是SQL中的一个非常重要的功能,可以完成很多复杂的计算,相当于一个表达式,可以放在任何可放表达式的地方。

语法 case when 条件 then 结果 when 条件 then 结果 else end。else可不加,是缺省条件下的值,如果不加,有缺省情况则为NULL。CASE WHEN还可以和GROUP BY 语句搭配使用,用在sum,count,max等聚合函数内部。

二、示例

2.1、把星座和血型一样的人归类到一起

hive有经典的列转行,但行转列也不应该忽略_第1张图片

结果

射手座,A            大海|凤姐
白羊座,A            孙悟空|猪八戒
白羊座,B            宋宋

select
    t1.base,
    concat_ws('|', collect_set(t1.name)) as name
from
    (select name,concat(constellation, ",", blood_type) as base
    from person_info) as t1
group by
    t1.base;

2.2、把学生选的所有课和成绩,分别汇总到一列

hive有经典的列转行,但行转列也不应该忽略_第2张图片

结果:

张三    语文,数学,英语   98,95,89
李四    语文,数学,英语   97,88,90

select 
    stu_name,
    concat_ws(',',collect_set(course)) as course,
    concat_ws(',',collect_set(score)) as score
from student
group by stu_name

2.3、case when 列换行示例

hive有经典的列转行,但行转列也不应该忽略_第3张图片

你可能感兴趣的:(hive,java,hadoop,行转列)