HiveSQL一天一个小技巧:如何借助于str_to_map进行行转列
目录
0 需求描述
1 需求分析
2 小 结
0 需求描述
有如下表格
partner | label | value |
001 | 原始证件号 | 9111030275820228X7 |
001 | 统一社会信用代码 | 9111030275820228X7 |
002 | 原始证件号 | 6111030255820228Y7 |
002 | 统一社会信用代码 | 6111030255820228Y7 |
需要转换如下结果:
partner | 原始证件号 | 统一社会信用代码 |
001 | 9111030275820228X7 | 8111030275820228X7 |
002 | 6111030255820228Y7 | 5111030255820228Y7 |
1 需求分析
(1)创建数据
create table t as
select '001' as partner , '原始证件号' as label,'9111030275820228X7' as value
union all
select '001' as partner , '统一社会信用代码' as label,'8111030275820228X7' as value
union all
select '002' as partner , '原始证件号' as label,'6111030255820228Y7' as value
union all
select '002' as partner , '统一社会信用代码' as label,'5111030255820228Y7' as value
(2) 数据分析
方法1:借助于聚合函数max()与case when实现。代码如下
select partner,max(case when label='原始证件号' then value else null end) as a,max(case when label='统一社会信用代码' then value else null end) as b
from t
group by partner
利用max()函数可以有效的去除NULL值,max()函数在计算的时候会忽略NULL值
方法2:借助于str_to_map实现
str_to_map(字符串参数, 分隔符1, 分隔符2)
使用两个分隔符将文本拆分为键值对。
分隔符1将文本分成K-V对,分隔符2分割每个K-V对。对于分隔符1默认分隔符是 ',',对于分隔符2默认分隔符是 '='
测试如下:
select str_to_map('aaa:11&bbb:22', '&', ':')+--------------------------+
| _c0 |
+--------------------------+
| {"bbb":"22","aaa":"11"} |
+--------------------------+
2 rows selected (2.226 seconds)
结果返回一个json对象。其中第一个参数用来分割整个串,指名需要按照哪个符号来分割K-V对,第二个参数用来指明K-V对中的分隔符。
从这测试案例也可以看出如果需要将数据拼接成一个json数组,也可以使用str_to_map的形式。
针对本问题:我们先做如下变换
第一步:先将label 和value拼接成K-V对
select concat_ws(':',label,value)from t +------------------------------+
| _c0 |
+------------------------------+
| 统一社会信用代码:8111030275820228X7 |
| 原始证件号:9111030275820228X7 |
| 原始证件号:6111030255820228Y7 |
| 统一社会信用代码:5111030255820228Y7 |
+------------------------------+
第二步: 利用collect_list()函数将多行转成单列
select concat_ws(',',collect_list(concat_ws(':',label,value))) from t group by partner+----------------------------------------------------+
| _c0 |
+----------------------------------------------------+
| 原始证件号:6111030255820228Y7,统一社会信用代码:5111030255820228Y7 |
| 统一社会信用代码:8111030275820228X7,原始证件号:9111030275820228X7 |
+----------------------------------------------------+
第三步:利用str_to_map()函数组合成json形式
select str_to_map(concat_ws(',',collect_list(concat_ws(':',label,value))),',',':' )from t group by partner+----------------------------------------------------+
| _c0 |
+----------------------------------------------------+
| {"原始证件号":"6111030255820228Y7","统一社会信用代码":"5111030255820228Y7"} |
| {"统一社会信用代码":"8111030275820228X7","原始证件号":"9111030275820228X7"} |
+----------------------------------------------------+
第四步:map结构的取数方式进行行转列。具体SQL如下
select partner,mmap['原始证件号'] as a ,mmap['统一社会信用代码'] as b from (select partner,str_to_map(concat_ws(',',collect_list(concat_ws(':',label,value))),',',':' ) as mmapfrom t group by partner) t
+----------+---------------------+---------------------+
| partner | a | b |
+----------+---------------------+---------------------+
| 002 | 6111030255820228Y7 | 5111030255820228Y7 |
| 001 | 9111030275820228X7 | 8111030275820228X7 |
+----------+---------------------+---------------------+2 rows selected (1.178 seconds)
方法1和方法2对比来看,方法2采用str_to_map的方法更优雅,效率更高一点,这是因为hive底层在这种高级的数据结构上做了优化,逻辑更优一点。
2 小 结
本文分析了一种采用str_to_map的方法进行行转列的方法,该方法结构优雅,从执行效率上来看性能更优,比通用的聚合函数加case when的方法效率更高。通过本文也可以利用str_to_map来拼接json串,不失为一种很好的技巧。
HiveSQL一天一个小技巧:如何借助于str_to_map进行行转列相关推荐
- HiveSQL一天一个小技巧:如何精准计算非连续日期累计值【闪电快车面试题】
0 需 求 稀疏字段累计求和问题 1 问题分析 根据图片中数据变换的形式,可以看出是根据字段term补齐数据中缺失的日期,term为连续日期的个数,当为12时,表明由2018-12-21到2019-0 ...
- HiveSql一天一个小技巧:如何不使用union all 进行列转行
目录 0 需求 1 数据准备 2 数据分析 3 小结 0 需求 如下: 1 数据准备 create table t1 as select '1' as id ,'mike' as name ,'22' ...
- HiveSql一天一个小技巧:如何在表的特定位置添加字段
hive表在某个特定的位置添加一个字段,在操作上是先在表的最后添加一个字段然后再将该字段移动到那个特定的位置 第一步:先在最后一个位置增加字段 alter table table_name add c ...
- 面试|HiveSQL常用的一些小技巧
SORT_ARRAY 函数声明如下. ARRAY sort_array(ARRAY<T>) 用途:对给定数组中的数据排序. 参数说明:ARRAY,ARRAY类型的数据.数组中的数据可为任意 ...
- 日常生活小技巧 -- UltraEdit复制16进制数据
如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/102677760 使用UE打开一个十六进制的文件,一复制才发现,粘贴出来的不是 ...
- 小技巧 ----- Java中的进制转换
自带的API Integer.parseInt(数, 数对应的进制)/Integer.valueOf(数, 数对应的进制) ----- 将不同进制数转为十进制数 Integer.toString(十进 ...
- css文本首行缩进字符是,建站小技巧,利用css进行首行缩进2个字符 设置
css设置首行缩进2个字符的方法:可以利用text-indent属性来设置首行缩进2个字符,如[text-indent:2em;].text-index属性用于规定文本块中首行文本的缩进,em是相对单 ...
- 视频教程-让你事半功倍的12个Excel小技巧-Office/WPS
让你事半功倍的12个Excel小技巧 Adobe平面设计与影视剪辑专家讲师.微软Office办公软件专家讲师.资深IT图书作者/策划人/出版人.深度/终身学习研究与实践者.Python全栈工程师/We ...
- scanner nextstring 空格_毫不起眼的小技巧,居然一分钟删除了数据中所有空格
每天都有很多粉丝留言或私信我Excel使用中的问题,可以说是五花八门,其实问题的出路在于先要有思路,发现其中的规律,有了思路.规律,问题也就迎刃而解了.今天小编和大家分享两个小技巧: 问题背景:某天一 ...
最新文章
- 1071. 小赌怡情(15)
- Java中如何使用session
- 计算机网络基础:网络分类和拓扑结构知识笔记
- 【算法基础笔记】常用的排序算法的时间、空间复杂度,部分排序算法原理
- php get验证,PHP+Ajax简单get验证操作示例
- Python中defaultdict用法
- easyui省市二级联动
- 开坑,写点Polymer 1.0 教程第2篇(上)——hello world篇
- 内幕:一个由罪犯秘密建立的“加密”手机公司
- python转化时区
- 老徐和阿珍的故事:Runnable和Callable有什么不同?
- elasticsearch api 调用
- VUE启动报错:Error: The project seems to require pnpm but it‘s not installed
- 【upc】生命曲线(线段树) —— 一个能让你搞懂线段树懒标的题目
- win7系统安装硬盘格式转换问题
- vue 过滤器 首字母大写
- 项目需求--将文件(html格式的字符串)转换为MultipartFile格式的文件然后转调第三方接口
- 通达OA11.6复现
- JS组件Bootstrap实现弹出框和提示框效果代码
- 计算机性能过低配色方案,系统之家windows7提示更改配色方案提高性能的方法