Hive中array嵌套map数据分离和处理

60 篇文章 2 订阅

1、准备要处理数据的临时表

drop table if exists xxlvc0103_json;
create table xxlvc0103_json as
select pt_day,uid,parms['value'] json_value
from oss_bi_all_api_play_feedback_active
where pt_day between '2019-01-01' and '2019-01-03'
  and parms['type']=7;

2、基础数据查看

hive> select * from xxlvc0103_json where uid=1414554412 limit 10;
OK
2019-01-01      1414554412      [{"enterType":1,"roomId":"87016658","time":1878903}]
2019-01-01      1414554412      [{"enterType":1,"roomId":"87016658","time":539579},{"enterType":3,"roomId":"60784259","time":5322},{"enterType":2,"roomId":"88028786","time":6923}]
2019-01-03      1414554412      [{"enterType":1,"roomId":"87016658","time":65044}]
2019-01-02      1414554412      [{"enterType":1,"roomId":"87016658","time":1638660}]
2019-01-01      1414554412      [{"enterType":1,"roomId":"87016658","time":1532060}]
2019-01-01      1414554412      [{"enterType":1,"roomId":"87016658","time":2033}]
2019-01-03      1414554412      [{"enterType":1,"roomId":"87016658","time":385518}]
2019-01-02      1414554412      [{"enterType":1,"roomId":"87016658","time":37454}]
2019-01-02      1414554412      [{"enterType":1,"roomId":"87016658","time":51099}]
2019-01-03      1414554412      [{"enterType":1,"roomId":"87016658","time":191371},{"enterType":3,"roomId":"87823728","time":1908}]
Time taken: 0.09 seconds, Fetched: 10 row(s)

3、array嵌套map数据的处理
先将数据进行有目的的替换,以满足hive中array、map复杂数据类型的要求;
然后利用LATERAL VIEW功能将list分开;
最后进行str_to_map操作,转换成我们想要的结构。

drop table if exists xxlvc0103_json_map;
create table xxlvc0103_json_map as
select pt_day,uid,str_to_map(list_col) value_map
from xxlvc0103_json
LATERAL VIEW explode(split(regexp_replace(regexp_replace(json_value,'\\},\\{','&'),'\"|\\[|\\]|\\{|\\}',''),'&')) list_str as list_col;

4、转换后的数据查看

hive> select * from xxlvc0103_json_map limit 10;
OK
2019-01-01      458410394       {"enterType":"1","roomId":"3449045","time":"3676"}
2019-01-01      1418279372      {"enterType":"1","roomId":"26216121","time":"14718"}
2019-01-01      138687495       {"enterType":"1","roomId":"87823728","time":"2614"}
2019-01-01      138687495       {"enterType":"1","roomId":"26216121","time":"2341"}
2019-01-01      138687495       {"enterType":"1","roomId":"87958988","time":"2812"}
2019-01-01      138687495       {"enterType":"1","roomId":"23882827","time":"3563"}
2019-01-01      1379155169      {"enterType":"1","roomId":"82416066","time":"26776"}
2019-01-01      803130862       {"enterType":"1","roomId":"3449045","time":"74915"}
2019-01-01      1418279372      {"enterType":"1","roomId":"82416066","time":"14964"}
2019-01-01      1418279372      {"enterType":"1","roomId":"87066404","time":"21867"}
Time taken: 0.071 seconds, Fetched: 10 row(s)

5、根据需求进行的数据汇总处理

select pt_day,value_map['enterType'] enterType,bigint(sum(value_map['time'])) level_time,count(distinct uid) uid_cnt,count(*) cnt
from xxlvc0103_json_map
group by pt_day,value_map['enterType'];
OK
2019-01-01      1       291795705016    24776   78926
2019-01-01      2       113509309       1746    5412
2019-01-01      3       128406659       1496    3832
2019-01-02      1       9512144176      21529   73883
2019-01-02      2       151180360       1847    5837
2019-01-02      3       225749773       1580    4503
2019-01-03      1       294769932990    25669   85037
2019-01-03      2       120973438       2025    6184
2019-01-03      3       308381650       1744    4990
Time taken: 29.418 seconds, Fetched: 9 row(s)

6、总结说明
问题总会有解决方法的,关键要有耐心、不焦躁。

### 回答1: 你好!我是 ChatGPT,很高兴为您提供帮助。根据您的描述,您问了一个关于Hive SQL的问题,具体是哪些函数可以用于处理JSON数据。以下是对您问题的回答: Hive SQL 支持处理 JSON 数据的函数,这些函数可以解析 JSON 数据并提取其的值。以下是一些常用的函数: - get_json_object:用于从 JSON 字符串提取指定键的值。 - json_tuple:用于从 JSON 字符串提取多个键的值,结果以元组的形式返回。 - json_array:用于将多个 JSON 字符串组合成一个 JSON 数组。 - json_object:用于将多个键值对组合成一个 JSON 对象。 您可以在 Hive SQL 的官方文档查找更多关于 JSON 数据处理函数的信息。 希望这些信息可以帮助您解决问题,如果您有任何其他问题或需要更多帮助,请随时问我! ### 回答2: 在Hive SQL,有一些常用的函数用于处理JSON数据,包括: 1. get_json_object:用于从JSON字符串获取指定字段的值。可以使用该函数获取嵌套结构的字段值,例如get_json_object(json_data, '$.name')。 2. json_tuple:用于从JSON字符串提取多个字段的值。使用该函数可以同时获取多个字段的值,并且可以指定字段的别名,例如json_tuple(json_data, 'name', 'age') AS (name, age)。 3. json_extract:用于从JSON对象提取出满足条件的成员。使用该函数可以提取出符合某个条件的JSON成员,例如json_extract(json_data, '$.persons[0]')。 4. json_array_contains:用于判断一个JSON数组是否包含指定值。使用该函数可以判断一个JSON数组是否包含某个特定的值,例如json_array_contains(json_data, 100)。 5. json_array_size:用于获取JSON数组的长度。使用该函数可以获取JSON数组元素的个数,例如json_array_size(json_data)。 6. json_map:用于将多个键值对转换为JSON对象。使用该函数可以将多个键值对转换为一个JSON对象,例如json_map('name', 'John', 'age', 25)。 7. json_object:用于将多个键值对转换为JSON对象。该函数与json_map类似,也可以将多个键值对转换为一个JSON对象,例如json_object('name', 'John', 'age', 25)。 这些函数可以在Hive SQL用于处理JSON数据,使得我们可以方便地处理包含JSON格式的数据。 ### 回答3: 在Hive SQL,有一些常用的函数用于处理JSON数据,包括以下几个: 1. get_json_object:用于获取JSON对象的字段值。通过指定JSON路径,可以获取JSON对象指定字段的值。 2. json_tuple:用于解析JSON对象并返回字段值的元组。可以将JSON对象作为参数传递给该函数,然后按照字段顺序获取对应的字段值。 3. json_array_contains:用于检查JSON数组是否包含指定的值。通过指定JSON数组和要检查的值,可以判断该值是否存在于JSON数组。 4. json_size:用于获取JSON数组或对象的大小。可以返回JSON数组元素的个数,或者返回JSON对象字段的个数。 5. json_tuple_count:用于获取JSON元组字段的个数。可以返回JSON元组字段的数量。 6. lateral view json_tuple:用于解析含有嵌套结构的JSON数据。通过指定JSON路径和字段列表,可以解析出指定字段的值,包括嵌套的字段。 这些函数可以帮助我们在Hive SQL处理JSON数据,提取所需的字段值、检查包含关系以及获取JSON对象的大小等操作。通过灵活运用这些函数,我们可以更方便地处理JSON格式的数据
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值