hivesql 将数据处理成复杂json

文章展示了如何使用HiveSQL将两种不同类型的数据转换成JSON格式。第一种涉及bankid数组和阶段信息,通过NAMED_STRUCT和COLLECT_LIST构造复杂结构。第二种涉及商品属性,如下装款式和穿搭风格,利用CONCAT和GROUPBY进行组合。

类型一

原数据:bankid是array类型
在这里插入图片描述
目标数据:
在这里插入图片描述

{
	"bankname": ["SPDB", "WS_HBBANK", "mytest"],
	"grid": [{
		"name": "阶段1",
		"values": ["38.0,1.0,1.0"]
	}, {
		"name": "阶段2",
		"values": ["11.0,0.0,0.0"]
	}, {
		"name": "阶段3",
		"values": ["11.0,0.0,0.0"]
	}]
}

代码:

SET odps.sql.hive.compatible = true
;

SELECT  
        TO_JSON(NAMED_STRUCT('bankname',bankid,'grid',grid)) AS json
FROM    (
            SELECT  bankid
                    ,COLLECT_LIST(grid) AS grid
            FROM    (
                        SELECT  bankid
                                ,grid
                        FROM    (
                                    SELECT  bankid
                                            ,NAMED_STRUCT('name','阶段1','values',COLLECT_LIST(index_001)) AS index_001
                                            ,NAMED_STRUCT('name','阶段2','values',COLLECT_LIST(index_002)) AS index_002
                                            ,NAMED_STRUCT('name','阶段3','values',COLLECT_LIST(index_003)) AS index_003
                                    FROM    (
                                                SELECT  ARRAY('SPDB','WS_HBBANK','mytest') AS bankid
                                                        ,'38.0,1.0,1.0' AS index_001
                                                        ,'11.0,0.0,0.0' AS index_002
                                                        ,'11.0,0.0,0.0' AS index_003
                                            ) o1
                                    GROUP BY bankid
                                ) o2
                        LATERAL VIEW EXPLODE(ARRAY(index_001,index_002,index_003)) tmp AS grid
                    ) o3
            GROUP BY bankid
        ) o4
;

类型二

原数据:
在这里插入图片描述
目标数据:
在这里插入图片描述

{
	"id": 53830,
	"value": [{
		"下装款式": ["直筒裤"]
	}, {
		"下装设计": ["纯色"]
	}, {
		"厚度": ["正常"]
	}, {
		"版型": ["正常"]
	}, {
		"穿搭风格": ["机能", "休闲"]
	}, {
		"裤长": ["长裤"]
	}]
}

代码:

SELECT  CONCAT('{"id":',id,',"value":',result,'}') AS json
FROM    (
            SELECT  id
                    ,CONCAT('[',CONCAT_WS(',',COLLECT_LIST(CONCAT('{"',type,'":',value,'}'))),']') AS result
            FROM    (
                        SELECT  id
                                ,type
                                ,CONCAT('[',CONCAT_WS(',',COLLECT_LIST(CONCAT('"',value,'"'))),']') AS value
                        FROM    temp_wxt_test_0627
                        GROUP BY id
                                 ,type
                    ) o1
            GROUP BY id
        ) o2
;
### 使用Hive SQL处理多层JSON数组 当使用Hive SQL来处理包含多层JSON数组的数据时,可以利用内置函数`get_json_object`以及`json_tuple`解析JSON字符串。对于更复杂的嵌套结构,通常会结合`LATERAL VIEW`和`explode`函数一起使用。 #### 解析单级JSON对象 对于简单的JSON字段提取,可以直接应用`get_json_object`: ```sql SELECT get_json_object(json_column, '$.key') AS value FROM table_name; ``` 此方法适用于基本键值对形式的JSON数据[^1]。 #### 处理多层嵌套JSON数组 针对多层次嵌套的情况,则需采用更为复杂的方式来进行拆分和平铺操作。下面是一个具体例子展示如何读取并展开具有两层嵌套结构(`array_of_objects`)中的元素: ```sql WITH exploded_data AS ( SELECT id, explode(array_of_objects) as single_obj FROM source_table ) SELECT t.id, get_json_object(t.single_obj, '$.nestedKey') nested_value, explode(get_json_object(t.single_obj, '$.innerArray')) inner_element FROM exploded_data t; ``` 上述查询首先通过CTE(Common Table Expression)创建了一个临时表,在其中执行了一次爆炸(explode),将外层数组里的每一个对象单独取出;接着再次调用`get_json_object`获取内部属性,并进一步对外部对象内的内层数组进行了第二次爆炸操作,从而实现了对整个层次结构的有效遍历与访问。 为了支持这种类型的分区裁剪优化,确保启用了配置参数`spark.sql.hive.metastorePartitionPruning=true`以便提高性能效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值