Hive-HiveQL练习题-提取位置

本文介绍了如何使用HiveSQL进行字符串拆分成数组、使用posexplode函数处理数据、以及实现成对提取、数组下标对应和explode+排名+交叉连接操作。实例涵盖了从基础操作到复杂数据处理的技巧。
摘要由CSDN通过智能技术生成

提取位置

题目 提取1的位置

create table position_1(
	a varchar(7) comment '含1的字符串'
) comment '1的位置';

insert into position_1
values ('1011'),('0101');

解决 字符串拆成数组

with tmp as(-- 1.字符串添加分隔符
  select
    a,
    concat_ws('-',substring(a,1,1),substring(a,2,1),substring(a,3,1),substring(a,4,1)) a1
  from position_1
)
select -- 3.posexplode 位置
  a,a1, -- Hive不能直接访问非group by字段
  concat_ws('-',collect_list(cast(pos + 1 as string))) pos_1
from tmp -- UDAF包围可以访问
lateral view posexplode(split(a1,'-')) pes as pos,val -- 2.字符串拆成数组
where val = 1
group by a,a1;

在这里插入图片描述

题目 成对提取

两列对应位置元素
在这里插入图片描述

create table paired_extraction(
  a string comment '字母和/',
  b string comment '数字和/'
) comment '成对地提取';

insert into paired_extraction
values ('A/B','1/3'),('B/C/D','4/5/2');

解决1 posexplode 位置相等

select -- 输出格式 多种
    a,b,
    concat_ws('/',collect_list(concat(val_a,':',val_b))) kv,
    collect_list(concat(val_a,':',val_b))[0] kv_0,
    collect_list(concat(val_a,':',val_b))[1] kv_1,
    collect_list(concat(val_a,':',val_b))[2] kv_2
from paired_extraction -- 两次追加的数据 关联范围笛卡尔积 追加第三次数据
lateral view posexplode(split(a,'/')) pes_a as pos_a,val_a -- 辅助扩展表数据 源表追加第一次数据
lateral view posexplode(split(b,'/')) pes_b as pos_b,val_b -- 源表追加第二次数据
where pos_a = pos_b 
group by a,b;

在这里插入图片描述

解决2 数组下标

select
    a,b,
    concat(split(a,'/')[0],'-',split(b,'/')[0]) ab, -- 下标一一对应
    concat(split(a,'/')[1],'-',split(b,'/')[1]) ab1,
    concat(split(a,'/')[2],'-',split(b,'/')[2]) ab2
from paired_extraction;

在这里插入图片描述

解决3 explode+排名+交叉连接

with tmp as(-- explode + 排名 = posexplode
    select a,b,val_a,row_number() over(partition by a,b) rn_a
    from paired_extraction
    lateral view explode(split(a,'/')) ex_a as val_a
),
    tmp1 as(
        select a,b,val_b,row_number() over(partition by a,b) rn_b
        from paired_extraction
        lateral view explode(split(b,'/')) ex_b as val_b
    )
select
    tmp.a,tmp.b,concat_ws('/',collect_list(concat(val_a,'-',val_b))) ab
from tmp,tmp1 -- 交叉连接 = lateral view 炸裂函数
where tmp.a = tmp1.a and rn_a = rn_b
group by tmp.a,tmp.b;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值