1. 概述
1.1 应用场景
用户有一接口返回 XML 格式数据(数据量较多),希望从该接口中取出所有数据。
存在问题如下:
需要循环取数,但接口没有分页结束标识。
API输入-分页取数 功能目前不支持 xpath 路径。
1.2 实现思路
使用「循环容器」节点自带的 loopTimes 参数构建偏移量,从 API 取数,并将接口非空的字段进行参数输出。
「循环容器」节点设置执行方式为条件执行,执行条件为该参数值不为空,即可实现循环取数,直至参数值为空,说明数据以全部取完,循环结束。
1.3 任务展示
FineDataLink 中的数据处理过程,详情参见:https://demo.finedatalink.com/ 「使用偏移量从XML接口取数」。
2. 操作步骤
2.1 场景模拟
使用 FDL 的数据服务功能发布一个接口,模拟返回 XML 格式数据的接口。如下图所示:
下图 SQL 语句含义:当 n 为 0 时,取前 30 条数据;当 n 为 30 时,取第 31 到 60 的数据;当 n 为 60 时,取第 61 到第 90 条的数据,以此类推。
2.2 构建初始条件参数
方案需要使用循环容器进行循环取数,循环容器的执行条件设置为:将每次取数的第一条数据输出为参数 ID,若 ID 不为空,则执行循环。
本节目的:构建一个非空的参数 ID(参数值非空即可),让第一次循环跑起来。
1)新建定时任务,拖入「数据转换」节点,进入「数据转换」节点。
2)拖入「Spark SQL」算子,输入语句:select '1' as a。如下图所示:
3)拖入「参数输出」算子,将数据输出给参数 ID。如下图所示:
2.3 设置循环容器
拖入「循环容器」节点,设置循环方式为「条件循环」,执行条件为:ID 不为空。如下图所示:
注:若数据较多,需根据实际情况调整最多循环的次数。
2.4 构建偏移量
1)「循环容器」节点中拖入「数据转换」节点,进入「数据转换」节点。
2)拖入「Spark SQL」算子,输入语句:select (${loopTimes}-1)*30 as skip。如下图所示:
注:loopTimes 为循环容器内置参数,初始值为1。
3)拖入「参数输出」算子,将数据输出给参数 n。如下图所示:
2.5 分页取数
1)「循环容器」节点中再拖入一个「数据转换」节点,进入「数据转换」节点。
2)拖入「API输入」算子,使用偏移量参数 n 进行取数,且每页取 30 条数据。如下图所示:
注1:该步骤为模拟从 API 接口中取出 XML 数据,用户根据实际情况进行操作。
注2:调用数据服务发布的 API 说明请参见:使用数据服务发布的API(POST application/json请求)
3)点击「数据预览」,可查看取出的数据。如下图所示:
4)需要对取出的数据进行解析。
实际场景中,需要拖入「XML解析」算子进行解析。本文示例为模拟实际场景,实际数据并非 XML 格式而为 JSON 格式,所以使用「JSON解析」算子进行解析。
2.6 数据分发
数据解析后,可根据实际情况进一步处理。
1)本文示例中,拖入「DB表输出」算子,将解析后的数据输出到数据表中。如下图所示:
2)在「JSON解析」算子后,再拖入一个「参数输出」算子,将取出数据第一条的主键字段(非空字段,本文示例选择「产品ID」字段),输出为参数 ID。如下图所示:
3)右键点击「JSON解析」算子,选择「数据分发」,设置「DB表输出」算子的分发条件是「产品ID」非空。
本步骤目的:
本文 2.3 节中,「循环容器」节点循环方式为「条件循环」,执行条件我们设置的参数 ID 值不为空(参数值为字段「产品ID」的值)。实际执行时,条件循环会先执行循环体,再判断是否终止循环,即最后一次执行时,会先取参数 ID 值为空执行,再终止循环,目标表中将多一条空数据。详情请参见:条件循环
所以,设置目标表写入条件:「产品ID」非空。
2.7 效果查看
1)点击「运行」按钮,运行成功后,界面如下图所示:
2)目标表中可查看已取出的数据,如下图所示:
3)用户可将任务发布到「生产模式」中。详情请参见:开发模式与生产模式
4)任务发布到「生产模式」后,可设置执行频率。详情请参见:定时调度