解析多层嵌套JSON并实现1:n关系

  • 文档创建者:Wendy123456
  • 历史版本:4
  • 最近更新:Wendy123456 于 2024-10-11
  • 1. 概述

    1.1 应用场景

    用户的 JSON 数据结构是多层数组嵌套,如下图所示:

    11.png

    现需要解析上层数组元素和下层数组元素,实现 1:n 的关系。

    例如:希望 titles 数组中的字段,能与 items 数组中(items 数组又包含 drivers 数组的字段关联起来。如下图所示:

    titles 中的字段,与 items 中 drivers 包含的元素是 1:n 关系。

    12.png

    1.2 实现思路

    以解析 JSON 数据结构中第一个对象为例(解析第二、第三个对象方案类似):

    1)获取 JSON 数据结构中第一个对象中的 titles 数组中的所有元素。

    2)使用 ROW_NUMBER() 函数,为查询结果集中的每一行生成一个唯一的行号(num列),行号从 0 开始。

    3)使用 get_json_object 函数,从 JSON 数据结构中第一个对象的 items 数组中,提取第 num 个元素,作为 a 列。

    4)解析 a 列内容。

    1.3 任务展示

    FineDataLink 中的数据处理过程,详情参见:https://demo.finedatalink.com/ 「解析多层嵌套JSON」。

    2. 操作步骤

    示例 JSON 数据:json.txt

    2.1 模拟 JSON 数据

    1)新建定时任务,拖入「数据转换」节点,进入数据转换节点。

    2)拖入文件输入算子,模拟用户场景,创建复杂 JSON 数据。如下图所示:

    13.png

    点击数据预览,如下图所示:

    14.png

    2.2 获取titles数组中的所有元素

    1)拖入JSON解析算子,源字段选择 column,勾选解析后保留所有上游输出字段按钮,添加字段 titles,解析路径为$[0].titles[*]

    该步骤目的:获取 JSON 数据结构中第一个对象中的 titles 数组中的所有元素。

    1728639147259688.png

    注:若需要获取 JSON 数据结构中第二个对象中的 titles 数组中的所有元素,解析路径为:$[1].titles[*]

    15.png

    2)点击数据预览,如下图所示:

    1728639237739264.png

    2.3 对titles列进行编号,根据编号取出items数组元素

    拖入「Spark SQL」算子,输入 SQL 语句:

    注:SQL 语句中的JSON 解析为点击生成。

    select *,get_json_object(column, concat("$",'[0].items[',num,']')) as a from 

    (select *,ROW_NUMBER() OVER(PARTITION BY 1 ORDER BY 1 asc)-1 as num from JSON解析)

    18.png

    SQL 语句说明如下表所示:

    SQL语句
    说明
    select *,ROW_NUMBER() OVER(PARTITION BY 1 ORDER BY 1 asc)-1 as num from JSON解析

    为查询结果集中的每一行生成一个唯一的行号(num 列),行号从 0 开始,所有行都被视为一个分区,并根据第一列的值升序排序

    • ROW_NUMBER():这是一个窗口函数,用于给查询结果集中的每一行分配一个唯一的行号。行号是根据指定的排序顺序生成的,默认从 1 开始

    • OVER:用于定义窗口函数的操作范围

    • PARTITION BY 1:结果集不进行分组

    • ORDER BY 1 asc:根据结果集的第一列进行升序排序

    • -1:将生成的行号从 1 开始的序列调整为从 0 开始的序列

    该语句执行后结果:

    19.png

    select *,get_json_object(column, concat("$",'[0].items[',num,']')) as a从 JSON 数据结构中第一个对象的 items 数组中,提取第 num 个元素,作为 a 列
    • get_json_object(column, path):这是一个用于从 JSON 对象中提取数据的函数

    • concat("$",'[0].items[',num,']'):从 JSON 数据结构中第一个对象的 items 数组中,提取第 num 个元素

    最终效果:

    20.png

    2.4 解析取出的items数组

    1)拖入「JSON解析」算子,解析 2.3 节生成的 a 字段(将 items 包含的 id、routeld 字段解析出来;将 items 中 drivers 包含的 driverid、itemId 字段解析出来)。如下图所示:

    1728646164650486.png

    2)点击数据预览,如下图所示:

    可看出 titles 字段,与 items 中 drivers 包含的元素是 1:n 关系。

    22.png

    2.5 删除多余字段

    拖入字段设置算子,删除 column、num、a 字段。如下图所示:

    23.png

    2.6 数据输出

    拖入「DB表输出」算子,将处理后的数据输出。如下图所示:

    1728646754837229.png





    附件列表


    主题: 数据开发-定时任务
    • 有帮助
    • 没帮助
    • 只是浏览
    • 评价文档,奖励 1 ~ 100 随机 F 豆!