暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

在HiveSQL里用str_to_map进行行列转换

IT那活儿 2024-12-31
234
点击上方“IT那活儿”公众号--专注于企业全栈运维技术分享,不管IT什么活儿,干就完了!!!  

  
在HiveSQL中,如需要进行行列转换,可以使用collect_list()函数结合concat_ws函数和str_to_map函数可以用来将字符串转换为Map来实现。


需求描述

如下表格:

需要实现的结果显示为:


实现过程

2.1 创建表模型

create tableIFNOTEXISTS T_C_TEXT(
STATIS_DATE varchar(20comment'统计日期'
IDvarchar (100comment'序号',
NAMEvarchar (100comment'名称',
  VALUEID varchar (100comment'身份编码'
comment'测试表1' partitioned by (STATIS_DATE varchar(20comment'统计日期'rowformatdelimitedfieldsterminatedby''storedas ORCFILE tblproperties ("orc.compress" = "NONE")

2.2 插入数据
insetr into T_C_TEXT (ID,NAME,VALUEIDvalues (001’,’身份编码’,’111222333111222333);
insetr into T_C_TEXT (ID,NAME,VALUEIDvalues (001’,’出生日期’,’20200728);
insetr into T_C_TEXT (ID,NAME,VALUEIDvalues (002’,’身份编码’,’444555666444555666);
insetr into T_C_TEXT (ID,NAME,VALUEIDvalues (002’,’出生日期’,’20000809);

2.3 实现方法
1)可用max()与case when 实现
代码如下:
2)用str_to_map实现
str_to_map(str[, delimiter1[, delimiter2[, keyDelimiter]]])

其中:

  • str:需要解析的字符串。

  • delimiter1(可选):字符串中键值对的分隔符,默认为逗号(,)。

  • delimiter2(可选):字符串中不同键值对之间的分隔符,默认为空格。

  • keyDelimiter(可选):字符串中键和值之间的分隔符,默认为冒号(:)。

先将name和valueid进行拼接:

用collect_list()函数将多行转成单列:

用str_to_map()函数组成json格式:

用map结构的取数进行行列转换:

结论:方法一和方法二都能实现行列转换,但相比方法一,方法二的效率更高一点。


END


本文作者:陈梦媛(上海新炬中北团队)

本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论