hive实现json数组拆解

本文介绍了一种从PAYCHANNELDETAIL表中拆解并处理JSON格式数据的方法,通过SQL语句实现了对复合型数据结构的有效解析,从而方便进一步的数据分析。
PAYCHANNELDETAIL表中间字段acquire_type是json格式如下

[{"payAmount":"375000","payChannelCode":"BOC"},{"payAmount":"376000","payChannelCode":"ABC"}]

下面是数据拆解操作

select pay_order_id,tag1,bill_date
from (
select pay_order_id,substr(acquire_type,2,length(acquire_type)-2) tags,bill_date from dd.PAYCHANNELDETAIL
) ta lateral view explode(split(tags, '},')) r1 as tag1
;

查询结果如下:

1603150000007617360 {"payAmount":"375000","payChannelCode":"BOC"} 2016-03-15
1603150000007617360 {"payAmount":"376000","payChannelCode":"ABC"} 2016-03-15


json属性拆解

SELECT
pay_order_id,
get_json_object(subjson,'$.payAmount') as payAmount,
get_json_object(subjson,'$.payChannelCode') as payChannelCode,
bill_date
FROM
dd.PAYCHANNELDETAIL_SUBJSON
### 如何解析嵌套的 JSON 数组 在大数据处理场景下,JSON 数据结构因其灵活性被广泛使用。然而,在实际应用中,经常遇到复杂的嵌套 JSON 结构,这给数据提取带来了挑战。 #### 使用 SQL 的 `GET_JSON_OBJECT` 函数 对于简单的 JSON 字段提取,可以利用 Hive 提供的内置函数 `GET_JSON_OBJECT` 来实现。例如,如果需要从字段 `message` 中获取键 `content` 对应的值,则可以通过以下语句完成: ```sql SELECT GET_JSON_OBJECT(message, '$.content') AS aa FROM table_json_01; ``` 此方法适用于单层 JSON 或者浅层次嵌套的情况[^1]。 #### 处理复杂嵌套 JSON 数组 当面对更深层次的嵌套 JSON 数组时,仅依靠 `GET_JSON_OBJECT` 是不够的。此时需借助 Hive 的 LATERAL VIEW 和 explode() 方法来展开数组中的每一项作为独立记录。以下是针对引用[2]提到的例子的具体解决方案: 假设原始 JSON 数据存储于表 `table_nested_json` 的列 `data` 中,其内容形式如下: ```json { "base": { "code": "xm", "name": "project" }, "list": [ { "ACode": "cp1", "AName": "Product1", "BList": [ {"BCode": "gn1", "BName": "Feature1"}, {"BCode": "gn2", "BName": "Feature2"} ] }, { "ACode": "cp2", "AName": "Product2", "BList": [{"BCode": "gn1", "BName": "Feature1"}] } ] } ``` 为了将上述 JSON 展开成所需的平面化表格结构 (即每条 userId 记录独占一行),可以采用以下查询逻辑: ```sql SELECT base_code, base_name, ACode, AName, BCode, BName FROM ( SELECT t.base['code'] AS base_code, t.base['name'] AS base_name, l.ACode, l.AName, b.BCode, b.BName FROM table_nested_json LATERAL VIEW OUTER EXPLODE(list) exploded_list AS l -- 将 list 数组拆分为多行 LATERAL VIEW OUTER EXPLODE(l.BList) exploded_blist AS b -- 进一步拆解内部 BList 数组 ) subquery; ``` 通过两次调用 `LATERAL VIEW` 及 `EXPLODE()` 函数分别作用于外层数组 (`list`) 和内层数组 (`BList`) 上,最终实现了完全扁平化的结果集输出[^2]。 #### Spark DataFrame API 实现方式 除了基于 HiveQL 查询之外,在分布式计算框架 Apache Spark 下也可以高效地解析此类嵌套 JSON 文件。下面展示了一个完整的 Scala 示例程序用于加载并转换类似的 JSON 文档: 首先定义输入路径以及创建初始 RDD: ```scala val inputPath = "/path/to/your/json/file.json" // 创建 SparkSession 并读入文件 import org.apache.spark.sql.SparkSession val spark = SparkSession.builder().appName("ParseNestedJson").getOrCreate() val df = spark.read.format("json").load(inputPath) df.printSchema() // 查看 schema 以便确认字段名 ``` 接着按照需求逐步分解各层级的数据结构: ```scala import org.apache.spark.sql.functions._ // Step 1: Extract 'base' fields into separate columns. val withBaseFieldsDf = df.select( col("base.code").as("codename"), col("base.name").as("name"), explode(col("list")).as("item") ) // Step 2: Further expand the inner array within each item of 'list'. val flattenedDf = withBaseFieldsDf.select( $"codename", $"name", $"item.ACode".as("acode"), $"item.AName".as("aname"), explode($"item.BList").as("bItem") ).select( $"codename", $"name", $"acode", $"aname", $"bItem.BCode".as("bcode"), $"bItem.BName".as("bname") ) flattenedDf.show(false) ``` 以上代码片段展示了如何运用 Spark DataFrame API 完成相同的目标——即将高度嵌套的 JSON 转换成易于分析的关系型布局[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值