hive 字符串拼接_Hive行转列详解

ef0eceef92a325bb45691eccabe2d31c.png

需求:

孙悟空 白羊座 A
沙悟净 射手座 A
宋松松 白羊座 B
猪八戒 白羊座 A
小凤姐 射手座 A

转换成以下格式:

白羊座,A 孙悟空|猪八戒
白羊座,B 宋松松
射手座,A 沙悟净|小凤姐

思路:表的行转列

知识点:concat(string1,string2) string1和string2需要是列名

-- 使用hive的beeline客户端,使用t_vehicle_log,并查看该表的secma

9c3cf4e6d25ebc4c2b3fa08c4752d910.png
-- 对其中两列字段进行拼接
select concat(vehicle_speed,vehicle_plate) from t_vehicle_log;

c1fa376c6b240ec109f67bfd404028fd.png
--concat()  对拼接的两列字符串中间用,连接
select concat(vehicle_speed,",",vehicle_plate) from t_vehicle_log;

加入我们要拼接多个列,并且需要用同样的分隔符(如A,B,C,D),该怎么做呢?

——我们可以使用concat_ws()

select concat_ws(",",monitor_id,camera_id,vehicle_plate) from t_vehicle_log;

620b8d7bba34d563905959600c25ce37.png

如果某一列有很多重复的字段,我们需要对其进行去重,并对去重字段返回一个数组,该怎么办呢?

—— 我们可以使用 collect_set()

select monitor_id from t_vehicle_log;

d2d7358167d792d0e50337013eef77e7.png
select collect_set(monitor_id) from t_vehicle_log;

dc2e06dc127a3d44af159fb28f729701.png

以上为本次需求所需的知识点的讲解,下面开始解决本次需求:

-- 建表:

使用concat_ws()查询:

select concat_ws(",",constellation,blood_type) c_b,name from person_info;

结果:

d75e6544cfe0fa685cb46eed3a0ea1b0.png

对上一步结果作为子查询,在查询:

select 
    t1.c_b, 
    collect_set(t1.name)
from(
    select concat_ws(",",constellation,blood_type) c_b,
    name from person_info
) t1
group by t1.c_b;

最终结果:collect_set()返回的是数组,concat_ws()接受的string或者是string数组

11c0ad95a4e061015e3a3e8804c39c0a.png

将数组划分开:

select 
    t1.c_b, 
    concat_ws("|",collect_set(t1.name))
from(
    select concat_ws(",",constellation,blood_type) c_b,
    name from person_info
) t1
group by t1.c_b;

结果:

60237d1c7948ae9c900757e64107c92d.png

到此,任务完成。我们下期再见。

1c332b4094534b7e9804d7d9b7426d95.png

一个不务正业的技术博主

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值