hive sql系列(八)——把 1234 转成 “原因1 原因2 原因3 原因4”

每天分享一个sql,帮助大家找到sql的快乐——鸣谢网友老蕉供稿

需求

需求:根据聚合在一起的编码转换成聚合在一起的码值
一个字段是   “1,2,3,4”  
这个1234分别代表原因1  原因2 原因3  原因4  
现在要把 1234  办成  “原因1  原因2 原因3  原因4”

建表语句

create table wangyou1(
    codeStr string
)
row format delimited fields terminated by '\t'
;

实现

insert overwrite table wangyou1 values
("1,2,3,4"),
("1,2"),
("2,3"),
("2,3,4");

结果

select
    t2.codeStr,
    concat_ws(",",collect_list(t2.codeValue))
from
    (select
        t1.codeStr,
        case t1.codeId
            when "1" then "原因1"
            when "2" then "原因2"
            when "3" then "原因3"
            when "4" then "原因4"
         end codeValue
    from
        (select
            codeStr,
            codeId
        from
            wangyou1
        lateral view explode(split(codeStr,",")) tmp as codeId
        )t1
    )t2
group by t2.codeStr
;

分析

1、这里需要将字符串1变成字符串2,hive并没有直接提供类似索引的
2、思路是切割字符串使之变成数组、使用炸裂函数行转列、case when进行字符串转换、聚合函数实现列转行
3、如果字符串是固定的可以使用replace这种进行直接替换
4、这里的实现方式更适合通用型、不确定的,但是值比较固定

扩展

--今天的扩展部分是使用map替换case when
--替换后的效果速度上比实现部分减少了130毫秒,代码行数减少了6行
select
    str_to_map('{"1":"原因1","2":"原因2","3":"原因3","4":"原因4"}')

select
    map("1","原因1","2","原因2","3","原因3","4","原因4")

select
    t2.codeStr,
    concat_ws(",",collect_list(t2.codeValue))
from
    (select
        t1.codeStr,
        map("1","原因1","2","原因2","3","原因3","4","原因4")[codeId] as codeValue
    from
        (select
            codeStr,
            codeId
        from
            wangyou1
        lateral view explode(split(codeStr,",")) tmp as codeId
        )t1
    )t2
group by t2.codeStr
;
Total MapReduce CPU Time Spent: 4 seconds 50 msec
OK
t2.codestr	_c1
1,2	原因1,原因2
1,2,3,4	原因1,原因2,原因3,原因4
2,3	原因2,原因3
2,3,4	原因2,原因3,原因4
Time taken: 14.648 seconds, Fetched: 4 row(s)

知识点

1、split(字符串,分割符):使用分割符切割字符串,返回一个数组
2、lateral view explode(数组):将数组字段拆分成多行
3、concat_ws(连接符,字符串,字符串):连接多个字符串
4、collect_list(分组键):将分组中的某列聚合成一个数组,数组中元素与分组后的数据保持一致
5、map:将多个排列好的k,v,k,v...变成一个map结构,这是初始化map结构的方式,取数据是map[key]

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

罗少说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值