hive中map相关函数总结

目录

hive官方函数解释

hive官网函数大全地址:hive官网函数大全地址

Return Type Name Description
map map(key1, value1, key2, value2, ...) Creates a map with the given key/value pairs.
array map_values(Map<K.V>) Returns an unordered array containing the values of the input map.
array map_keys(Map<K.V>) Returns an unordered array containing the keys of the input map.
map<string,string> str_to_map(text[, delimiter1, delimiter2]) Splits text into key-value pairs using two delimiters. Delimiter1 separates text into K-V pairs, and Delimiter2 splits each K-V pair. Default delimiters are ',' for delimiter1 and ':' for delimiter2.
Tkey,Tvalue explode(MAP<Tkey,Tvalue> m) Explodes a map to multiple rows. Returns a row-set with a two columns (key,value) , one row for each key-value pair from the input map. (As of Hive 0.8.0.).

示例

1、map(key1, value1, key2, value2, ...)

sql 复制代码
SELECT map('name', '张三', 'age', 20, 'gender', '男') AS student;
---结果:
student	
{"age":"20","gender":"男","name":"张三"}

2、map_values(Map<K.V>)

sql 复制代码
SELECT map_keys(map('name', '张三', 'age', 20, 'gender', '男')) AS keys;
---结果:
keys
["name","age","gender"]

3、map_values(Map<K.V>)

sql 复制代码
SELECT map_values(map('name', '张三', 'age', 20, 'gender', '男')) AS values;
---结果:
values	
["张三","20","男"]

4、str_to_map(str, delimiter1, delimiter2)

str_to_map 函数用于将一个字符串转换为 Map 对象。具体来说,str_to_map 函数会将一个由键值对组成的字符串解析成一个 Map 对象,其中键和值之间使用指定的分隔符进行分隔。其中,str 是要转换的字符串,delimiter1 是键值对之间的分隔符,delimiter2 是键和值之间的分隔符。默认情况下,delimiter1 的值是 ',',delimiter2 的值是 ':'。

sql 复制代码
SELECT str_to_map('name:张三,age:20,gender:男', ',', ':') AS student;
---结果:
student	
{"age":"20","gender":"男","name":"张三"}

SELECT str_to_map('name=张三,age=20,gender=男', ',', '=') AS student;
---结果:
student	
{"age":"20","gender":"男","name":"张三"}

5、explode (map)

sql 复制代码
select explode(map('A',10,'B',20,'C',30));
select explode(map('A',10,'B',20,'C',30)) as (key,value);
select tf.* from (select 0) t lateral view explode(map('A',10,'B',20,'C',30)) tf;
select tf.* from (select 0) t lateral view explode(map('A',10,'B',20,'C',30)) tf as key,value;
---上述四个结果均为:
key     value
A       10	
B       20	
C       30

实战

给出一组学生数据,有名字,课程,等级,分数等字段,现在求每门课的情况,包含平均成绩,及这门课包含哪些学生及学生的等级

sql 复制代码
with stud as
( select  'zhang3' as name ,'优' as grade  ,'math' as course ,'88' as score  
  union all 
  select  'li4' as name ,'良' as grade  ,'math' as course ,'72' as score
    union all 
  select  'zhao6' as name ,'差' as grade  ,'math' as course ,'44' as score
    union all 
  select  'wang5' as name ,'优' as grade  ,'chinese' as course ,'80' as score
    union all 
  select  'zhao6' as name ,'优' as grade  ,'chinese' as course ,'55' as score
    union all 
  select  'tian7' as name ,'优' as grade  ,'chinese' as course ,'75' as score
)

--sql1
select course, collect_set(concat(name,':',grade)) as collect , avg(score) from stud group by course;
---结果:
course             collect                                             avg(score)	
math        ["li4:良","zhao6:差","zhang3:优"]                           68.0
chinese     ["wang5:优","tian7:优","zhao6:优"]                          70.0
----sql2
select course, concat_ws(',',collect_set(concat(name,':',grade))) as strings , avg(score) from stud group by course;
---结果:
course                      strings                                        avg(score)
math             li4:良,zhao6:差,zhang3:优                                  68.0
chinese          wang5:优,tian7:优,zhao6:优                                 70.0
----sql3
select course, str_to_map(concat_ws(',',collect_set(concat(name,':',grade))),',',':') as maps , avg(score) from stud group by course;
---结果:
course                               maps                              avg(score)	
math                 {"li4":"良","zhang3":"优","zhao6":"差"}             68.0
chinese              {"tian7":"优","wang5":"优","zhao6":"优"}            70.0

注意:

第一种sql,collect 字段的类型是array;第二种sql,strings字段的类型是string;第三种sql,maps字段的类型是map;

问题来了,能否在第二种的基础上,实现第一种和第三种的结果,且字段类型是string;

下面实现第二种转化为第三种,实际上就是map格式转换成json字符串;

sql 复制代码
with stud as
( select  'zhang3' as name ,'优' as grade  ,'math' as course ,'88' as score  
  union all 
  select  'li4' as name ,'良' as grade  ,'math' as course ,'72' as score
    union all 
  select  'zhao6' as name ,'差' as grade  ,'math' as course ,'44' as score
    union all 
  select  'wang5' as name ,'优' as grade  ,'chinese' as course ,'80' as score
    union all 
  select  'zhao6' as name ,'优' as grade  ,'chinese' as course ,'55' as score
    union all 
  select  'tian7' as name ,'优' as grade  ,'chinese' as course ,'75' as score
)

select 
course
,concat('{"',string2,'"}') as string3
from  
(select 
course
,regexp_replace(string1,'\\,','\\"\\,\\"') as string2
from  
(
select 
    course,
    concat_ws(',', collect_list(concat_ws('":"', k,v) ) ) as string1
from (
select course, str_to_map(concat_ws(',',collect_set(concat(name,':',grade))),',',':') as maps , avg(score) 
from stud group by course
)test_map_1
lateral view outer explode(maps) kv as k,v
group by course
) tt 
) tm 

---结果:
course                               string3                            	
math                 {"li4":"良","zhang3":"优","zhao6":"差"}           
chinese              {"tian7":"优","wang5":"优","zhao6":"优"}        
相关推荐
心疼你的一切6 小时前
解密CANN仓库:AIGC的算力底座、关键应用与API实战解析
数据仓库·深度学习·aigc·cann
qq_12498707538 小时前
基于Hadoop的信贷风险评估的数据可视化分析与预测系统的设计与实现(源码+论文+部署+安装)
大数据·人工智能·hadoop·分布式·信息可视化·毕业设计·计算机毕业设计
十月南城11 小时前
Hive与离线数仓方法论——分层建模、分区与桶的取舍与查询代价
数据仓库·hive·hadoop
鹏说大数据13 小时前
Spark 和 Hive 的关系与区别
大数据·hive·spark
B站计算机毕业设计超人13 小时前
计算机毕业设计Hadoop+Spark+Hive招聘推荐系统 招聘大数据分析 大数据毕业设计(源码+文档+PPT+ 讲解)
大数据·hive·hadoop·python·spark·毕业设计·课程设计
B站计算机毕业设计超人13 小时前
计算机毕业设计hadoop+spark+hive交通拥堵预测 交通流量预测 智慧城市交通大数据 交通客流量分析(源码+LW文档+PPT+讲解视频)
大数据·hive·hadoop·python·spark·毕业设计·课程设计
AI架构师小马13 小时前
Hive调优手册:从入门到精通的完整指南
数据仓库·hive·hadoop·ai
数据架构师的AI之路13 小时前
深入了解大数据领域Hive的HQL语言特性
大数据·hive·hadoop·ai
Gain_chance14 小时前
33-学习笔记尚硅谷数仓搭建-DWS层交易域用户粒度订单表分析及设计代码
数据库·数据仓库·hive·笔记·学习·datagrip
十月南城16 小时前
Hadoop基础认知——HDFS、YARN、MapReduce在现代体系中的位置与价值
hadoop·hdfs·mapreduce