hivesql 将json格式字符串转为数组

hivesql 将json格式字符串转为数组

完整过程SQL在文末

json 格式字符串

本案例 json 字符串参考格式,请勿使用本数据

json 复制代码
{
    "data": [
        {
            "province": 11,
            "id_card": "110182198903224674",
            "name": "闾丘饱乾"
        },
        {
            "province": 21,
            "id_card": "210182198903224674",
            "name": "贺巧"
        }
    ]
}

测试数据

本案例测试数据,复制保存后请勿格式化

json 复制代码
{"data":[{"province":11,"id_card":"110182198903224674","name":"闾丘饱乾"},{"province":21,"id_card":"210182198903224674","name":"贺巧"},{"province":31,"id_card":"310182198903224674","name":"方加牡"},{"province":41,"id_card":"410182198903224674","name":"邱赣"},{"province":42,"id_card":"420182198903224674","name":"郝郑惭"},{"province":52,"id_card":"520182198903224674","name":"余烂"},{"province":62,"id_card":"620182198903224674","name":"宇文酚"},{"province":81,"id_card":"810182198903224674","name":"赖队瞻"}]}

创建测试数据库

sql 复制代码
create database test;
sql 复制代码
use test;

创建数据表

本案例为数仓分层设计

  1. 创建ods层原始数据表
  2. 创建dwd层维度数据表
  3. ETL转换ods层数据插入到dwd层

创建ods层原始数据表

sql 复制代码
create table people_ods(
    info string
);

加载测试数据

bash 复制代码
load data local inpath "/root/people.json" overwrite into table people_ods;

创建dwd层维度数据表

sql 复制代码
create table people_dwd(
    id_card string,
    name string,
    province string
);

ETL转换ods层数据插入到dwd层

sql 复制代码
insert overwrite table people_dwd (
select json_tuple(people,'id_card','name','province') as (id_card,name,province) from (
    select people from (select split(regexp_replace(regexp_replace(get_json_object(info,'$.data'),'\\[|\\]',''),'\\}\\,\\{','\\}\\;\\{'),";") people_list from people_ods) ods
    lateral view explode(people_list) t1 as people) t2);

查询测试

sql 复制代码
select * from people_dwd;

ETL 解析

查询原始数据

sql 复制代码
select info from people_ods;

获取json格式数组字符串

使用 get_json_object 函数获取 data 属性

sql 复制代码
select get_json_object(info,'$.data') from people_ods;

将字符串两端的 [] 去掉

使用 regexp_replace 函数将 开头的 [ 和结尾的 ] 替换为 空字,

注意:由于hive使用java语言编写所以需要使用转义字符

sql 复制代码
select regexp_replace(get_json_object(info,'$.data'),'\\[|\\]','') from people_ods;

清洗后的格式

json 复制代码
{"province":11,"id_card":"110182198903224674","name":"闾丘饱乾"},{"province":12,"id_card":"120182198903224674","name":"慕容芋岛"}

将字符串中 },{ 转为 };{ 对象之间使用分号间隔

json格式字符串对象分隔符和属性分隔符都使用的是逗号

使用split函数切分的时候无法区分对象和属性

故而将对象分隔符替换为分号便于split函数切分

sql 复制代码
select regexp_replace(regexp_replace(get_json_object(info,'$.data'),'\\[|\\]',''),'\\}\\,\\{','\\}\\;\\{') from people_ods;

清洗后的格式

json 复制代码
{"province":11,"id_card":"110182198903224674","name":"闾丘饱乾"};{"province":12,"id_card":"120182198903224674","name":"慕容芋岛"}

两次清洗后结果对比

转为 字符串数组

sql 复制代码
select split(regexp_replace(regexp_replace(get_json_object(info,'$.data'),'\\[|\\]',''),'\\}\\,\\{','\\}\\;\\{'),';') from people_ods;

列转行

使用 UDTF 裂函数 将单行数据转换为多行数据

sql 复制代码
select people from (select split(regexp_replace(regexp_replace(get_json_object(info,'$.data'),'\\[|\\]',''),'\\}\\,\\{','\\}\\;\\{'),";") people_list from people_ods) ods
lateral view explode(people_list) t as people;

json 解析

使用 get_json_object 或者 json_tuple 函数 对json对象进行解析

本案例使用 json_tuple 函数

sql 复制代码
select json_tuple(people,'id_card','name','province') as (id_card,name,province) from (
    select people from (select split(regexp_replace(regexp_replace(get_json_object(info,'$.data'),'\\[|\\]',''),'\\}\\,\\{','\\}\\;\\{'),";") people_list from people_ods) ods
    lateral view explode(people_list) t1 as people) t2;

完成过程SQL

sql 复制代码
-- 创建测试数据库
create database test;
-- 使用测试数据库
use test;

-- 创建ods层原始数据表
create table people_ods(
    info string
);

-- 加载数据
load data local inpath "/root/people.json" overwrite into table people_ods;
-- 查询ods层袁术数据
select info from people_ods;

-- 获取json格式数组字符串
select get_json_object(info,'$.data') from people_ods;

-- 将字符串两端的 [] 去掉
select regexp_replace(get_json_object(info,'$.data'),'\\[|\\]','') from people_ods;

-- 将字符串中 },{ 转为 };{ 对象之间使用分号间隔
select regexp_replace(regexp_replace(get_json_object(info,'$.data'),'\\[|\\]',''),'\\}\\,\\{','\\}\\;\\{') from people_ods;

-- 转为 字符串数组
select split(regexp_replace(regexp_replace(get_json_object(info,'$.data'),'\\[|\\]',''),'\\}\\,\\{','\\}\\;\\{'),';') from people_ods;

-- 列转行
select people from (select split(regexp_replace(regexp_replace(get_json_object(info,'$.data'),'\\[|\\]',''),'\\}\\,\\{','\\}\\;\\{'),";") people_list from people_ods) ods
lateral view explode(people_list) t as people;

-- 转json对象后解析
select json_tuple(people,'id_card','name','province') as (id_card,name,province) from (
    select people from (select split(regexp_replace(regexp_replace(get_json_object(info,'$.data'),'\\[|\\]',''),'\\}\\,\\{','\\}\\;\\{'),";") people_list from people_ods) ods
    lateral view explode(people_list) t1 as people) t2;

-- 创建dwd层维度数据表
create table people_dwd(
    id_card string,
    name string,
    province string
);

-- ETL转换ods层数据插入到dwd层
insert overwrite table people_dwd (
select json_tuple(people,'id_card','name','province') as (id_card,name,province) from (
    select people from (select split(regexp_replace(regexp_replace(get_json_object(info,'$.data'),'\\[|\\]',''),'\\}\\,\\{','\\}\\;\\{'),";") people_list from people_ods) ods
    lateral view explode(people_list) t1 as people) t2);

select * from people_dwd;
相关推荐
青岛前景互联信息技术有限公司8 小时前
OpenClaw 重构智慧消防:AI时代的平台融合实践
大数据·人工智能
梦梦代码精8 小时前
BuildingAI 上部署自定义工作流智能体:5 个实用技巧
大数据·人工智能·算法·开源软件
极客老王说Agent8 小时前
2026智造前瞻:实在Agent生产排期智能助理核心功能与使用方法详解
大数据·人工智能·ai·chatgpt
数智化精益手记局10 小时前
什么是设备维护管理?设备维护管理包含哪些内容?
大数据·网络·人工智能·安全·信息可视化
AllData公司负责人10 小时前
通过Postgresql同步到Doris,全视角演示AllData数据中台核心功能效果,涵盖:数据入湖仓,数据同步,数据处理,数据服务,BI可视化驾驶舱
java·大数据·数据库·数据仓库·人工智能·python·postgresql
桃花键神11 小时前
Bright Data Web Scraping指南 2026: 使用 MCP + Dify 自动采集海外社交媒体数据
大数据·前端·人工智能
阿里云大数据AI技术12 小时前
一条 SQL 生成广告:Hologres 如何实现素材生成到投放分析一体化
人工智能·sql
zxsz_com_cn13 小时前
设备预测性维护中大数据分析的关键应用实例
数据挖掘·数据分析
x***r15113 小时前
dbeaver-ce-24.1.3-x86_64-setup安装步骤详解(附DBeaver数据库管理与SQL编写教程)
数据库·sql
程序鉴定师13 小时前
西安App开发推荐与业界认可的优秀实践
大数据·小程序