当前位置: 首页 > news >正文

hive中map相关函数总结

目录

  • hive官方函数解释
  • 示例
  • 实战

hive官方函数解释

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

Return TypeNameDescription
mapmap(key1, value1, key2, value2, …)Creates a map with the given key/value pairs.
arraymap_values(Map<K.V>)Returns an unordered array containing the values of the input map.
arraymap_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,Tvalueexplode(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, …)

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

2、map_values(Map<K.V>)

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

3、map_values(Map<K.V>)

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 的值是 ‘:’。

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)

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

实战

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

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 scoreunion all select  'zhao6' as name ,'差' as grade  ,'math' as course ,'44' as scoreunion all select  'wang5' as name ,'优' as grade  ,'chinese' as course ,'80' as scoreunion all select  'zhao6' as name ,'优' as grade  ,'chinese' as course ,'55' as scoreunion 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字符串;

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 scoreunion all select  'zhao6' as name ,'差' as grade  ,'math' as course ,'44' as scoreunion all select  'wang5' as name ,'优' as grade  ,'chinese' as course ,'80' as scoreunion all select  'zhao6' as name ,'优' as grade  ,'chinese' as course ,'55' as scoreunion 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":"优"}        
http://www.lryc.cn/news/265575.html

相关文章:

  • HttpServletRequestWrapper、HttpServletResponseWrapper结合 过滤器 实现接口的加解密、国际化
  • 最大通关数
  • MySQL中EXPLAIN关键字解释
  • 初始JavaScript详解【精选】
  • 计数排序,基数排序及排序总结
  • 【LeetCode】459. 重复的子字符串(KMP2.0)
  • CSS(五) -- 动效实现(立体盒子旋转-四方体+正六边)
  • Win10使用OpenSSL生成证书的详细步骤(NodeJS Https服务器源码)
  • sql_lab之sqli中的堆叠型注入(less-38)
  • 第5章-第3节-Java中对象的封装性以及局部变量、this、static
  • IP应用场景的规划
  • 27 redis 的 sentinel 集群
  • 计算机网络 网络安全技术
  • WebAssembly 的魅力:高效、安全、跨平台(下)
  • 二维码智慧门牌管理系统升级:确保公安机关数据安全无忧
  • Golang leetcode59 螺旋矩阵
  • 深度学习(Deep Learning) 简介
  • 服务器raid中磁盘损坏或下线造成阵列降级更换新硬盘重建方法
  • Ubuntu 常用命令之 exit 命令用法介绍
  • 依托亚马逊云科技构建韧性应用
  • Prometheus-JVM
  • flink sql1.18.0连接SASL_PLAINTEXT认证的kafka3.3.1
  • pytorch张量的创建
  • Web自动化测试工具的优势分析
  • 黑豹程序员-读properties属性文件本地正常,打包jar后运行出错
  • PyQt6 QTimer计时器控件
  • Vue:defineAsyncComponent(异步组件)、component(动态组件)、keep-alive(缓存组件)
  • 14 款最佳文件恢复软件 [2024 年最佳精选工具]
  • Redis基础篇-004 Redis的Java客户端
  • 【数据结构和算法】---栈和队列的互相实现