反馈已提交

网络繁忙

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

  • 文档创建者:Wendy123456
  • 历史版本:5
  • 最近更新:Wendy123456 于 2024-10-24
  • 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 列内容。

    2. 操作步骤

    2.1 模拟 JSON 数据

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

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

    13.png

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

    12.png

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

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

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

    1728639147259688.png

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

    15.png

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

    1729749430971199.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 开始的序列

    该语句执行后结果:

    14.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 个元素

    最终效果:

    15.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 豆!

    鼠标选中内容,快速反馈问题

    鼠标选中存在疑惑的内容,即可快速反馈问题,我们将会跟进处理。

    不再提示

    10s后关闭



    AI

    联系我们
    在线支持
    获取专业技术支持,快速帮助您解决问题
    工作日9:00-12:00,13:30-17:30在线
    页面反馈
    针对当前网页的建议、问题反馈
    售前咨询
    采购需求/获取报价/预约演示
    或拨打: 400-811-8890 转1
    qr
    热线电话
    咨询/故障救援热线:400-811-8890转2
    总裁办24H投诉:17312781526
    提交页面反馈
    仅适用于当前网页的意见收集,帆软产品问题请在 问答板块提问前往服务平台 获取技术支持