HiveSQL题——数据炸裂和数据合并

目录

一、数据炸裂

0 问题描述

1 数据准备

2 数据分析

3 小结

二、数据合并

0 问题描述

1 数据准备

2 数据分析

3 小结

一、数据炸裂

0 问题描述

    如何将字符串1-5,16,11-13,9" 扩展成 "1,2,3,4,5,16,11,12,13,9" 且顺序不变。

1 数据准备

with data as (select '1-5,16,11-13,9' as a)

2 数据分析

 步骤一:explode(split(a, ',')) 炸裂 + row_number()排序,一行变多行,且对每行的数据排序,保证有序性。

with data as (select '1-5,16,11-13,9' as a)
select
    a1,
    row_number() over () as rn
from (
         select
             explode(split(a, ',')) as a1
         from data
     ) tmp1;

输出结果:

步骤二: lateral view explode(split(a, '-'))  、max(b) - min(b) as diff

(1)lateral view +explode 侧写和炸裂,一行变多行,并将源表中每行的输出结果与该行连接;

 (2)group by a1, rn .......  select  min(a2)   as start_data得到每个分组的起始值

 (3)max(a2) - min(a1) 得到每个分组的步长

with data as (select '1-5,16,11-13,9' as a)
select
    a1,
    rn,
    cast(min(a2) as int)           as start_data,
    cast(max(a2) - min(a2) as int) as diff
from (
         select
             a1,
             a2,
             rn
         from (
                  select
                      a1,
                      row_number() over () as rn
                  from (
                           select
                               explode(split(a, ',')) as a1
                           from data
                       ) tmp1
              ) tmp2
                  lateral view explode(split(a1, '-')) table1 as a2
     ) tmp3
group by a1, rn;

 输出结果是:

步骤三: 根据步长生成索引值,起始值加上索引值获取展开值

侧写和炸裂,根据分组的步长 diff  生成对应的索引值pos
 (1)lateral view posexplode(split(repeat(',', diff), ',')) table2 as pos, item;
该代码等价于:  lateral view posexplode(split(space(diff), '')) table2 as pos, item;

 (2)(start_data + pos) as  end_data,起始值加上索引值获取展开值
with data as (select '1-5,16,11-13,9' as a)
select
    a1,
    rn,
    start_data,
    diff,
    (start_data + pos) as end_data
from (
         select
             a1,
             rn,
             cast(min(a2) as int)           as start_data,
             cast(max(a2) - min(a2) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值