DataWorks提供的for-each遍历节点可获取对赋值节点或者赋值参数的最后一条查询结果或输出语句,并内置部分变量可在每次遍历中获取到指定数据。输出结果的行数或者长度,将决定遍历节点遍历次数,DataWorks目前存在128次上限,并且不支持指定并发执行,你可以通过以下方案突破128次执行次数,并实现并发执行。
实现原理
由于DataWorks通过二维数组行数和一维数组按照逗号“,”切分后的数据个数来决定遍历节点的遍历次数,所以,我们可以在产品该交互基础上,通过改造赋值节点输出的结果,结合赋值节点通过一维数组与二维数组结果集的输出方式,以及遍历节点内置变量间接实现并发取数执行。
需求分析
假设上游输出的结果集为一维数组,数据为:1,2,3,4;
改造前:每次遍历通过变量${dag.foreach.current}获取读取一个数据,将默认遍历4次。
预期:遍历2次,每次遍历定义两个任务并发读取当前遍历值中的部分数据。
设计业务流程
以下仅关键配置说明,请先阅读DataWorks官方文档关于for-each遍历节点的介绍后,再操作。
- 1. 改造原始数据。
将赋值节点原输出结果1,2,3,4按逗号切分为2组:1#2,3#4。逗号将决定分组数,每组通过#号拼接的数据个数将决定遍历节点内部节点个数。
本输出语句按照逗号“,”拆分为2组,即遍历节点的遍历次数为2;“#”将每组数据进一步拆分。
- 2. 定义节点获取目标值。
每次遍历通过变量${dag.foreach.current}获取每一组数据(第一组:1#2;第二组:3#4),并通过函数对每组数据进行切分,每个任务分别读取函数切分后的数据。
遍历次数\取值 |
当前遍历数据 |
函数切分当前遍历数据 |
第一次遍历 |
${dag.foreach.current}:1#2 |
取1:split_part('${dag.foreach.current}', '#', 1) 取2:split_part('${dag.foreach.current}', '#', 2) |
第二次遍历 |
${dag.foreach.current}:3#4 |
取3:split_part('${dag.foreach.current}', '#', 1) 取4:split_part('${dag.foreach.current}', '#', 2) |
验证并确认结果
前往运维中心通过补数据>补当前节点及下游节点功能,同时运行赋值节点与遍历节点,通过查看遍历节点内部节点来查看每次遍历运行情况。
遍历次数\节点名 |
sql01 |
sql02 |
第一次遍历 |
||
第二次遍历 |