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

2024-02-01 18:12
文章标签 数据 合并 炸裂 hivesql

本文主要是介绍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)
selecta,row_number() over () as rn
from (selectexplode(split(a, ',')) as afrom data)tmp1;

输出结果:

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

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

 (2)group by a, rn .......  select  min(b)   as start_index 得到每个分组的起始值

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

with data as (select '1-5,16,11-13,9' as a)
selecta,rn,min(b)          as start_data,max(b) - min(b) as diff
from (selecta,rn,bfrom (selecta,row_number() over () as rnfrom (selectexplode(split(a, ',')) as afrom data) tmp1) tmp2lateral view explode(split(a, '-')) table1 as b) tmp3
group by a, rn;

 输出结果是:

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

(1) lateral view posexplode(split(space(cast (diff as int)), '')) table1 as pos, item;
   侧写和炸裂,根据分组的步长 diff  生成对应的索引值pos

 (2)(start_data + pos) as  str,起始值加上索引值获取展开值

with data as (select '1-5,16,11-13,9' as a)
selecta,rn,cast ((start_data + pos) as int) as str
from (selecta,rn,start_index,diff,posfrom (selecta,rn,min(b) as start_data,max(b) - min(b) as difffrom (selecta,rn,bfrom (selecta,row_number() over () as rnfrom (selectexplode(split(a, ',')) as afrom data) tmp1) tmp2lateral view explode(split(a, '-')) table1 as b) tmp3group by a, rn) tmp4lateral view posexplode(split(space(cast(diff as int)), '')) table1 as pos, val) tmp5order by rn;

输出结果是: 

步骤四: 对a,rn, diff 字段分组,拼接str字符串得到最终结果值

with data as (select '1-5,16,11-13,9' as a)
selectconcat_ws(',', collect_set(cast(str as string))) as result
from (selecta,rn,cast((start_index + pos) as int) as strfrom (selecta,rn,start_index,diff,posfrom (selecta,rn,min(b)  as start_index,max(b) - min(b) as difffrom (selecta,rn,bfrom (selecta,row_number() over () as rnfrom (selectexplode(split(a, ',')) as afrom data) tmp1) tmp2lateral view explode(split(a, '-')) table1 as b) tmp3group by a, rn) tmp4lateral view posexplode(split(space(cast(diff as int)), '')) table1 as pos, val) tmp5) tmp6
group by a,rn,diff;

最终的输出结果:1,2,3,4,5,16,11,12,13,9 

3 小结

数据炸裂的思路一般是:1.计算区间【a,b】的步长(差值)diff;2.利用split分割函数+ posexplode等 将一行变成 diff+1 行,生成对应的下角标pos(pos的取值为【0,diff】);3.【a,b】区间的起始值 (a + pos) 将数据平铺开;4.基于平铺开后的数据集进一步加工处理,例如:分组聚合等。

二、数据合并

0 问题描述

   面试题:基于A表的数据生成B表数据

1 数据准备

create table if not exists  tableA
(id        string comment '用户id',name   string comment '用户姓名'
) comment 'A表';insert overwrite table tableA values('1','aa'),('2','aa'),('3','aa'),('4','d'),('5','c'),('6','aa'),('7','aa'),('8','e'),('9','f'),('10','g');create table if not exists  tableC
(id     string comment '用户id',name   string comment '用户姓名'
) comment 'C表';insert overwrite table tableC values('3','aa|aa|aa'),('4','d'),('5','c'),('7','aa|aa'),('8','e'),('9','f'),('10','g');

2 数据分析

 步骤1:寻找满足条件的断点

selectid,name,if(name != lag_name, 1, 0) as flag
from (selectid,name,lag(name, 1, name) over (order by cast(id as int)) as lag_namefrom tableA) tmp1;

输出结果为:

 步骤2:断点处标记为1,非断点处标记为0,并对断点标记值进行累加,构造分组标签

selectid,name,--并对断点标记值进行累加,构造分组标签sum(flag) over (order by cast(id as int)) grp
from (selectid,name,--断点处标记为1,非断点处标记为0if(name != lag_name, 1, 0) flagfrom (selectid,name,lag(name, 1, name) over (order by cast(id as int)) as lag_namefrom tableA) tmp1) tmp2;

输出结果为:

步骤3:按照分组标签进行数据合并,并取得分组中最大值作为id

selectmax_id,
-- collect_list 数据聚合并拼接concat_wsconcat_ws('|', collect_list(name)) as name
from (selectname,grp,max(id) over (partition by grp) max_idfrom (selectid,name,sum(if(name != lag_name, 1, 0)) over (order by cast(id as int)) as grpfrom (selectid,name,lag(name, 1, name) over (order by cast(id as int)) as lag_namefrom tableA) tmp1) tmp2) tmp3
group by max_id, grp;

输出结果为:

通过max_id, grp分组,对name进行 concat_ws('|', collect_list(name)) 聚合拼接,得出最终的结果

3 小结

 断点分组问题的算法总结步骤1:寻找满足条件的断点步骤2:断点处标记值为1,非断点处标记为0步骤3:对断点标记值进行累加 sum(xx)over(order by xx),构造分组标签步骤4:按照分组标签进行分组求解问题


 

这篇关于HiveSQL题——数据炸裂和数据合并的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/668057

相关文章

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

使用SpringBoot整合Sharding Sphere实现数据脱敏的示例

《使用SpringBoot整合ShardingSphere实现数据脱敏的示例》ApacheShardingSphere数据脱敏模块,通过SQL拦截与改写实现敏感信息加密存储,解决手动处理繁琐及系统改... 目录痛点一:痛点二:脱敏配置Quick Start——Spring 显示配置:1.引入依赖2.创建脱敏

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化:

Python数据分析与可视化的全面指南(从数据清洗到图表呈现)

《Python数据分析与可视化的全面指南(从数据清洗到图表呈现)》Python是数据分析与可视化领域中最受欢迎的编程语言之一,凭借其丰富的库和工具,Python能够帮助我们快速处理、分析数据并生成高质... 目录一、数据采集与初步探索二、数据清洗的七种武器1. 缺失值处理策略2. 异常值检测与修正3. 数据

pandas实现数据concat拼接的示例代码

《pandas实现数据concat拼接的示例代码》pandas.concat用于合并DataFrame或Series,本文主要介绍了pandas实现数据concat拼接的示例代码,具有一定的参考价值,... 目录语法示例:使用pandas.concat合并数据默认的concat:参数axis=0,join=

C#代码实现解析WTGPS和BD数据

《C#代码实现解析WTGPS和BD数据》在现代的导航与定位应用中,准确解析GPS和北斗(BD)等卫星定位数据至关重要,本文将使用C#语言实现解析WTGPS和BD数据,需要的可以了解下... 目录一、代码结构概览1. 核心解析方法2. 位置信息解析3. 经纬度转换方法4. 日期和时间戳解析5. 辅助方法二、L

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

解决mysql插入数据锁等待超时报错:Lock wait timeout exceeded;try restarting transaction

《解决mysql插入数据锁等待超时报错:Lockwaittimeoutexceeded;tryrestartingtransaction》:本文主要介绍解决mysql插入数据锁等待超时报... 目录报错信息解决办法1、数据库中执行如下sql2、再到 INNODB_TRX 事务表中查看总结报错信息Lock

使用C#删除Excel表格中的重复行数据的代码详解

《使用C#删除Excel表格中的重复行数据的代码详解》重复行是指在Excel表格中完全相同的多行数据,删除这些重复行至关重要,因为它们不仅会干扰数据分析,还可能导致错误的决策和结论,所以本文给大家介绍... 目录简介使用工具C# 删除Excel工作表中的重复行语法工作原理实现代码C# 删除指定Excel单元