type
Post
status
Published
password
date
Jul 8, 2022
slug
summary
map、Array、json的常用方法与处理方式
category
数据库
tags
hive
icon
Map类型
map的结构
创建map的表
插入map数据
查询map中的数据
删除map数据
别搞笑了,hive不支持删除操作。可以使用insert overwrite。同理,也不支持修改
map的操作函数
key键查询
value值查询
键值对查询(键值对个数)
map类型数据的加工
将map列拆分为key、value列
把两个字段变成map:str_to_map
测试数据如下:
pcgid | mobilegid | value |
p1 | m1 | 0.6 |
p1 | m2 | 0.9 |
p2 | m1 | 1.0 |
需要的结果是:
对源表进行group by之后对另外两个字段变成map
gid | gids | count(1) |
p1 | {"m2":"0.9","m1":"0.6"} | 2 |
p2 | {"m1":"1.0"} | 1 |
Array操作
Array的结构
创建Array表
插入数据
查询
Array的操作函数
array_contains()
是否包含某个值,Boolean型(true/false,where条件中比较合适)
explode()拆成单条多行记录
Hive中array嵌套map数据分离和处理
创建
插入数据
查询
Json的操作
json_tuple与get_json_object都是hive自带的UDF。
json_tuple 相对于 get_json_object 的优势就是一次可以解析多个 Json 字段。有兴趣可以参考如何在 Apache Hive 中解析 Json 数组这篇文章,其中也说了通过自行开发UDF来实现相关的功能。创建案例
json_tuple提取数据
- 语法:
json_tuple(json_string, k1, k2 ...)
- 说明:解析json的字符串json_string,可指定多个json数据中的key,返回对应的value。如果输入的json字符串无效,那么返回NULL
get_json_object提取数据
- 语法:
get_json_object(json_string, '$.key')
- 说明:解析json的字符串json_string,返回path指定的内容。如果输入的json字符串无效,那么返回NULL。这个函数每次只能返回一个数据项。
explode、regexp_replace函数
要解析这个json数组,仅用上面介绍的两个函数就解析不出来了,还需用到如下介绍的几个函数:
explode(Array OR Map)
explode()函数接收一个array或者map类型的数据作为输入,然后将array或map里面的元素按照每行的形式输出,即将hive一列中复杂的array或者map结构拆分成多行显示,也被称为列转行函数。
A |
B |
C |
A | 10 |
B | 20 |
C | 30 |
posexplode(Array OR Map)
posexplode相比在explode之上,将一列数据转为多行之后,还会输出数据的下标。
0 | A |
1 | B |
2 | C |
0 | A | 10 |
1 | B | 20 |
2 | C | 30 |
regexp_replace(string A, string B, string C)
将字符串A中的符合java正则表达式B的部分替换为C。注意,在有些情况下要使用转义字符,类似oracle中的regexp_replace函数。