hive sql构建Json和Json List及Json数组处理

本文介绍如何使用 Hive SQL 构建 JSON 和 JSON 列表,并通过具体示例展示了如何利用 concat 函数创建 JSON 字符串及从 JSON 中提取数据的方法。需要注意的是,当 concat 连接的字段中有 null 值时,结果将返回 null。

hive sql构建Json和Json List

 执行结果如下:

 附脚本:

with t as (
select 
       concat(
               '{'
                  ,'"key1":"','data1','"'
              ,',','"key2":"','data2','"'
              ,',','"key3":"','data3','"'
              ,'}'
      
             ) js
      ,concat(
               '{'
                  ,'"key1":"','data1','"'
              ,',','"key2": ',
                               '{'
                                  ,'"key1":"','data1','"'
                              ,',','"key2":"','data2','"'
                              ,',','"key3":"','data3','"'
                              ,'}'
                              ,' '
              ,',','"key3":"','data3','"'
              ,'}'
      
      ) jl    -- json list
      
)
select 
 js
 ,get_json_object(js,'$.key1') as data1
 ,get_json_object(js,'$.key2') as data2
 ,get_json_object(js,'$.key3') as data3
 ,jl
 ,get_json_object(jl,'$.key2') as data22
from t

另外这里有个注意点,concat在连接字段时,如果有一个为null,那么整个concat的结果全部为null,需要特别注意一下.

Json数组处理

详见Hive常用技巧记录_yipiantian的博客-优快云博客 中的第一部分第6

### 解决方案 在 Hive处理嵌套的 JSON 结构体数组数据可以通过多种方法实现,具体取决于需求复杂度。以下是几种常见的解决方案: #### 方法一:使用 `get_json_object` 函数 Hive 提供了一个内置 UDF 函数 `get_json_object` 来提取 JSON 字符串中的特定字段。对于嵌套的 JSON 数据,可以指定路径来访问深层结构。 例如,假设有一个包含嵌套 JSON 的列 `data`,其中部分结构如下: ```json { "name": "Alice", "details": { "age": 25, "hobbies": ["reading", "traveling"] } } ``` 要提取 `age` `hobbies` 数组的第一个元素,可以这样写 SQL 查询: ```sql SELECT get_json_object(data, '$.details.age') AS age, -- 获取 details 下的 age 值 get_json_object(data, '$.details.hobbies[0]') AS hobby -- 获取 hobbies 数组的第一个元素 FROM your_table; ``` 这种方法适用于仅需提取少量字段的情况[^3]。 --- #### 方法二:使用 `json_tuple` 函数 如果需要一次性提取多个字段,`json_tuple` 是更高效的选择。它允许通过一次调用返回多个键对应的值。 继续以上述 JSON 数据为例,查询可以写为: ```sql SELECT name, age, hobbies_array[0] AS first_hobby FROM ( SELECT json_tuple(data, 'name', 'details') AS (name, details_str) FROM your_table ) t1 LATERAL VIEW explode(get_json_object(details_str, '$.hobbies')) exploded_table AS hobbies_array WHERE age = CAST(get_json_object(details_str, '$.age') AS INT); ``` 这里需要注意的是,`json_tuple` 只能用于顶层字段,因此对于嵌套结构仍需结合其他函数完成解析[^4]。 --- #### 方法三:利用 `JsonSerDe` 进行序列化与反序列化 为了更好地支持复杂的 JSON 数据结构,Hive 支持通过自定义 SerDe(Serializer/Deserializer)插件加载 JSON 数据。这种方式能够自动映射 JSONHive 表模式。 创建表时可指定 `ROW FORMAT SERDE` 使用 `org.openx.data.jsonserde.JsonSerDe` 插件: ```sql CREATE TABLE json_table ( name STRING, details STRUCT<age:INT, hobbies:ARRAY<STRING>> ) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' STORED AS TEXTFILE; ``` 之后可以直接像操作普通表一样读取 JSON 数据,无需手动解析每个字段。 然而,此方法的一个潜在问题是性能开销较大,尤其是在只需获取少数几个字段的情况下。 --- #### 方法四:组合使用 `explode` `lateral view` 当面对多层嵌套的 JSON 数组时,通常还需要借助 `explode` `lateral view` 将数组展开为独立行以便进一步分析。 假设有如下 JSON 数据: ```json [ {"id": 1, "events": [{"type": "click"}, {"type": "view"}]}, {"id": 2, "events": [{"type": "share"}]} ] ``` 可以用以下方式将其转换为扁平化的表格形式: ```sql SELECT id, event_type FROM ( SELECT data.id AS id, data.events AS events_list FROM your_table LATERAL VIEW explode(events) exploded_events AS events_list ) t1 LATERAL VIEW explode(t1.events_list) exploded_event AS event_data WHERE event_data.type IS NOT NULL; ``` 上述代码实现了对嵌套数组的逐级分解并筛选有效记录。 --- ### 总结 针对不同场景可以选择合适的策略: - 如果只是简单抽取某些字段,则优先考虑 **`get_json_object` 或 `json_tuple`**; - 若涉及大量复杂嵌套关系或者频繁更新 Schema,推荐采用 **`JsonSerDe`** 方案; - 面向大规模分布式计算环境下的深度挖掘任务,建议综合运用 **`explode` `lateral view`** 技术优化效率。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值