关于阿里云开发者:DataWorks功能实践速览-05循环与遍历

6次阅读

共计 11197 个字符,预计需要花费 28 分钟才能阅读完成。

简介:DataWorks 性能实际系列,帮忙您解析业务实现过程中的痛点,进步业务性能应用效率!通过往期的介绍,您曾经理解到在 DataWorks 上进行工作运行的最要害的几个知识点,其中上期参数透传中为您介绍了能够将上游节点参数透传到上游节点的非凡节点——赋值节点,联合赋值节点和其余节点,可实现循环或遍历读取解决数据的工作。本期为您介绍如何在 DataWorks 上实现循环与遍历工作。

往期回顾:

  • DataWorks 性能实际速览 01 期——数据同步解决方案:为您介绍不同场景下可选的数据同步计划。
  • DataWorks 性能实际速览 02 期——独享数据集成资源组:为您介绍进行数据同步时,可应用的资源组与网络连通计划、注意事项。
  • DataWorks 性能实际速览 03 期——生产开发环境隔离:为您介绍 DataWorks 通过规范模式提供开发环境与生产环境隔离及不同环境的权限要求。
  • DataWorks 性能实际速览 04 期——参数透传:为您介绍如何在 DataWorks 上实现参数透传,即把上游工作的参数透传到上游工作。

通过往期的介绍,您曾经理解到在 DataWorks 上进行工作运行的最要害的几个知识点,其中上期参数透传中为您介绍了能够将上游节点参数透传到上游节点的非凡节点——赋值节点,联合赋值节点和其余节点,可实现循环或遍历读取解决数据的工作。本期为您介绍如何在 DataWorks 上实现循环与遍历工作。

性能举荐:循环节点与遍历节点

在进行数据开发工作编译的过程中,有时咱们可能碰到须要进行循环或遍历的工作场景,DataWorks 为您提供两类非凡节点以满足此类场景的应用需要。

比照项 <span> 循环节点(do-while 节点)</span> <span> 遍历节点(for-each 节点)</span>
利用场景 依据对象汇合的数量逐条读取并判断是否满足循环条件,如果满足则持续循环,如果不满足则退出循环,循环次数依据每次循环的判断后果而定,不固定。 依据对象汇合的数量逐条读取(遍历),循环次数已知。
节点利用 <span> 您能够从新编排 do-while 节点外部的业务流程,将须要循环执行的逻辑写在节点内,再编辑 end 循环判断节点来管制是否退出循环。同时您也能够联合赋值节点来循环遍历赋值节点传递的后果集。</span> <span> 您能够通过 for-each 节点来循环遍历赋值节点传递的后果集。同时您也能够从新编排 for-each 节点外部的业务流程。</span>

通常循环节点(do-while 节点)与遍历节点(for-each 节点)会与赋值节点联结应用,将上游节点的输入通过赋值节点传递给上游节点,在上游节点中对上游节点的输入后果进行循环或遍历。

同时,循环节点(do-while 节点)与遍历节点(for-each 节点)与其余简略节点不统一的中央在于,这类逻辑节点本身蕴含外部节点。以 do-while 节点为例,一个 do-while 节点创立实现后,通常会为您主动创立好 3 个外部节点,同时您也能够将外部节点从新进行外部业务流程和节点内容的编译。

# Part1:循环节点(do-while 节点)

## 1.1 节点组成

DataWorks 的 do-while 节点是蕴含外部节点的一种非凡节点,您在创立实现 do-while 节点时,同时也主动创立实现了三个外部节点:start 节点(循环开始节点)、sql 节点(循环工作节点)、end 节点(循环完结判断节点),通过外部节点组织成外部节点流程,实现工作的循环运行。

如上图所示:

* start 节点 是外部节点的开始节点,不承载具体的工作代码。
* sql 节点 DataWorks 默认为您创立好了一个 SQL 类型的外部工作运行节点,您也能够删除默认的sql 节点 后,自定义外部循环工作的运行节点。

您的循环工作是 SQL 类型的工作,则能够间接双击默认的sql 节点,进入节点的代码开发页面开发循环工作代码。
* 您的循环工作比较复杂,您能够在外部节点流程中新建其余工作节点,并依据理论状况从新构建节点的运行流程。通常循环工作的业务流程会与赋值节点、分支节点、归并节点联结应用,典型利用场景阐明请参见典型利用:与赋值节点联结应用。

阐明 自定义循环工作节点时,您能够删除外部节点间的依赖关系,从新编排循环节点外部业务流程,但须要别离将start 节点end 节点 别离作为 do-while 节点外部业务流程的首末节点。

* end 节点

end 节点 是 do-while 节点的循环判断节点,来管制 do-while 节点循环次数,其本质上是一个赋值节点,输入 truefalse两种字符串,别离代表持续下一个循环和不再持续循环。
* end 节点 反对应用 ODPS SQL、SHELL 和 Python(Python2)三种语言进行循环判断代码开发,同时 do-while 节点为您提供了便当的内置变量,便于您进行 end 代码开发。内置变量的介绍请参见内置变量和变量取值案例,不同语言开发的样例代码请参见案例 1:end 节点代码样例。

## 1.2 应用限度与注意事项

* 循环反对

仅 DataWorks 标准版及以上版本反对应用 do-while 节点。
* do-while 节点最多反对循环 128 次,end 节点 管制循环次数时,如果超过了 128 次,则运行会报错。

* 外部节点

自定义循环工作节点时,您能够删除外部节点间的依赖关系,从新编排循环节点外部业务流程,但须要别离将 start 节点end 节点 别离作为 do-while 节点外部业务流程的首末节点。
* 在 do-while 节点的外部节点应用分支节点进行逻辑判断或者后果遍历时,须要同时应用归并节点。
* do-while 节点的外部节点 end 节点 在代码开发时,不反对增加正文。

* 调测运行

DataWorks 为规范模式时,不反对在 DataStudio 界面间接测试运行 do-while 节点。如果您想测试验证 do-while 节点的运行后果,您须要将蕴含 do-while 节点的工作公布提交到运维核心,在运维核心页面运行 do-while 节点工作。如果您在 do-while 节点内应用了赋值节点传递的值,请在运维核心测试时,同时运行赋值节点和循环节点。
* 在运维核心查看 do-while 节点的执行日志时,您须要右键实例,单击 查看外部节点 来查看外部节点的执行日志。

## 1.3 典型利用:与赋值节点联结应用

do-while 节点经常与赋值节点联结应用,如下图所示。

与赋值节点联结应用时:

* 您须要将赋值节点的输入作为赋值节点的本节点输出,且与赋值节点做好上下游依赖关系的配置,其余配置注意事项请参见案例 2:与赋值节点联结应用。
* 与赋值节点联结应用时,能够应用一些内置变量来获取以后已循环次数、赋值参数值等循环变量值,详情请参见内置变量。

## 1.4 内置变量

DataWorks 的 do-while 节点,通过外部节点来实现循环运行工作,每次工作循环运行时,您能够通过一些内置的变量来获取以后已循环次数和偏移量。

<span> 内置变量 </span> <span> 含意 </span> <span> 取值 </span>
<span>${dag.loopTimes}</span></strong></td><td><span> 以后已循环次数 </span></td><td><span> 第一次循环为 1、第二次为 2、第三次为 3…第 n 次为 n。</span></td></tr><tr><td><strong><span>${dag.offset}</span> <span> 偏移量 </span> <span> 第一次循环为 0、第二次为 1、第三次为 2…第 n 次为 n -1。</span>

如果您联结应用了赋值节点,则还能够通过以下形式来获取赋值参数值和循环变量参数。

阐明 以下以变量示例中,_input_是 do-while 节点中自定义的 本节点输出参数 名称,理论应用时,需替换为您实在的名称。

<span> 内置变量 </span> <span> 含意 </span>
<span>${dag.</span></strong><em><strong><span>input</span></strong></em><strong><span>}</span></strong></td><td><span> 上游赋值节点传递的数据集。</span></td></tr><tr><td><strong><span>${dag.</span><span>input</span><span>[${dag.offset}]}</span></strong></td><td><span> 循环节点外部获取以后循环的数据行。</span></td></tr><tr><td><strong><span>${dag.</span><span>input</span><span>.length}</span> <span> 循环节点外部获取数据集长度。</span>

##

## 1.5 变量取值案例

* 案例 1

上游赋值节点为 shell 节点,最初一条输入后果为2021-03-28,2021-03-29,2021-03-30,2021-03-31,2021-04-01,此时,各变量的取值如下:

<span> 内置变量 </span> <span> 第 1 次循环时取值 </span> <span> 第 2 次循环时取值 </span>
<span>${dag.</span></strong><em><strong><span>input</span></strong></em><strong><span>}</span></strong></td><td colspan=”2″><strong><span>2021-03-28,2021-03-29,2021-03-30,2021-03-31,2021-04-01</span></strong></td></tr><tr><td><strong><span>${dag.</span><span>input</span><span>[${dag.offset}]}</span></strong></td><td><strong><span>2021-03-28</span></strong></td><td><strong><span>2021-03-29</span></strong></td></tr><tr><td><strong><span>${dag.</span><span>input</span><span>.length}</span> <span>5</span>
<span>${dag.loopTimes}</span></strong></td><td><span>1</span></td><td><span>2</span></td></tr><tr><td><strong><span>${dag.offset}</span> <span>0</span> <span>1</span>

* 案例 2

上游赋值节点为 ODPS SQL 节点,最初一条 select 语句查问出两条数据:

+----------------------------------------------+

| uid            | region | age_range | zodiac |

+----------------------------------------------+

| 0016359810821  | 湖北省 | 30~40 岁   | 巨蟹座 |

| 0016359814159  | 未知   | 30~40 岁   | 巨蟹座 |

+----------------------------------------------+

此时,各变量的取值如下:

<span> 内置变量 </span> <span> 第 1 次循环时取值 </span> <span> 第 2 次循环时取值 </span>
<span>${dag.</span></strong><em><strong><span>input</span></strong></em><strong><span>}</span></strong></td><td colspan=”2″><code>+———————————————-+</code><code>| uid &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| region | age_range | zodiac |</code><code>+———————————————-+</code><code>| 0016359810821 &nbsp;| 湖北省 | 30~40 岁 &nbsp; | 巨蟹座 |</code><code>| 0016359814159 &nbsp;| 未知 &nbsp; | 30~40 岁 &nbsp; | 巨蟹座 |</code><code>+———————————————-+</code></td></tr><tr><td><strong><span>${dag.</span><span>input</span><span>[${dag.offset}]}</span></strong></td><td><strong><span>0016359810821, 湖北省,30~40 岁, 巨蟹座 </span></strong></td><td><strong><span>0016359814159, 未知,30~40 岁, 巨蟹座 </span></strong></td></tr><tr><td><strong><span>${dag.</span><span>input</span><span>.length}</span> <span>2</span><span> 阐明 </span><span> 二维数组的行数为数据集长度,以后赋值节点输入的二维数组行数为 2。</span>
<span>${dag.</span></strong><em><strong><span>input</span></strong></em><strong><span>[0][1]</span></strong><strong><span> 阐明 </span></strong><span> 二维数组的第一行第一列的取值。</span></td><td colspan=”2″><strong><span>0016359810821</span></strong></td></tr><tr><td><strong><span>${dag.loopTimes}</span> <span>1</span> <span>2</span>
<span>${dag.offset}</span> <span>0</span> <span>1</span>

#

# Part2:遍历节点(for-each 节点)

## 2.1 节点组成

DataWorks 的 for-each 节点是蕴含外部节点的一种非凡节点,您在创立实现 for-each 节点时,同时也主动创立实现了三个外部节点:start 节点(循环开始节点)、sql 节点(循环工作节点)、end 节点(循环完结判断节点),通过外部节点组织成外部节点流程,实现对上游赋值接节点输入后果的循环遍历。

如上图所示:

* sql 节点 DataWorks 默认为您创立好了一个 SQL 类型的外部工作运行节点,您也能够删除默认的sql 节点 后,自定义外部循环遍历工作的运行节点。

您的循环遍历工作是 SQL 类型的工作,则能够间接双击默认的sql 节点,进入节点的代码开发页面开发工作代码。
* 您的循环遍历工作比较复杂,您能够在外部节点流程中新建其余工作节点,并依据理论状况从新构建节点的运行流程。

阐明 自定义循环工作节点时,您能够删除外部节点间的依赖关系,从新编排循环节点外部业务流程,但须要别离将start 节点end 节点 别离作为 for-each 节点外部业务流程的首末节点。

* start 节点 end 节点 是外部节点业务流程每次循环遍历的开始节点与完结节点,不承载具体的工作代码。

阐明 for-each 节点的 end 节点不管制循环遍历的次数,for-each 节点的循环遍历次数由上游赋值节点理论输入管制。

## 2.2 应用限度与注意事项

* 上下游依赖

for-each 遍历节点须要遍历赋值节点传递的值,所以赋值节点需作为 for-each 节点的上游节点,for-each 节点须要依赖赋值节点。

* 循环反对

仅 DataWorks 标准版及以上版本反对应用 for-each 节点。
* for-each 节点最多反对循环 128 次,如果超过了 128 次,则运行会报错。理论循环遍历次数由上游赋值节点理论输入管制。

* 一维数组类型的输入,循环遍历次数即为一维数组元素的个数。例如,赋值节点的赋值语言为 SEHLL 或 Python(Python2)时,输入后果为一维数组:2021-03-28,2021-03-29,2021-03-30,2021-03-31,2021-04-01,则 for-each 节点会循环 5 次实现遍历。
* 二维数组类型的输入,循环遍历次数即为二维数组元素的行数。例如,赋值节点的赋值语言为 OdpsSQL 时,输入后果为二维数组:

+----------------------------------------------+

| uid            | region | age_range | zodiac |

+----------------------------------------------+

| 0016359810821  | 湖北省 | 30~40 岁   | 巨蟹座 |

| 0016359814159  | 未知   | 30~40 岁   | 巨蟹座 |

+----------------------------------------------+

则 for-each 节点会循环 2 次实现遍历。

* 外部节点

您能够删除 for-each 节点的外部节点间的依赖关系,从新编排外部业务流程,但须要别离将 start 节点end 节点 别离作为 for-each 节点外部业务流程的首末节点。
* 在 for-each 节点的外部节点应用分支节点进行逻辑判断或者后果遍历时,须要同时应用归并节点。

* 调测运行

DataWorks 为规范模式时,不反对在 DataStudio 界面间接测试运行 for-each 节点。如果您想测试验证 for-each 节点的运行后果,您须要将蕴含 for-each 节点的工作公布提交到运维核心,在运维核心页面运行 for-each 节点工作。
* 在运维核心查看 for-each 节点的执行日志时,您须要右键实例,单击 查看外部节点 来查看外部节点的执行日志。

## 2.3 典型利用

DataWorks 的 for-each 节点次要用于有循环遍历的场景,且须要与赋值节点联结应用,将赋值节点作为 for-each 节点的上游节点,将赋值节点的输入后果赋值给 for-each 节点后,一次次循环来遍历赋值节点的输入后果。

## 2.4 内置变量

DataWorks 的 for-each 节点每次循环遍历赋值节点的输入后果时,您能够通过一些内置的变量来获取以后已循环次数和偏移量。

<span> 内置变量 </span> <span> 含意 </span> <span> 与 for 循环比照 </span>
<span>${dag.loopDataArray}</span></strong></td><td><span> 获取赋值节点的数据集 </span></td><td><span> 相当于 for 循环中的代码后果:</span><span>data=[]</span></td></tr><tr><td><strong><span>${dag.foreach.current}</span> <span> 获取以后遍历值 </span> <span> 以上面的 for 循环代码为例:</span><span>for(int i=0;i<data.length;i++) {print(data[i]); }</span><ul><li><span>data[i]</span><span> 相当于 </span><span>${dag.foreach.current}</span></strong><span>。</span></li><li><strong><span>i</span></strong><span> 相当于 </span><strong><span>${dag.offset}</span><span>。</span></li></ul>
<span>${dag.offset}</span></strong></td><td><span> 以后偏移量 </span><span>(每一次遍历绝对于第一次的偏移量)</span></td></tr><tr><td><strong><span>${dag.loopTimes}</span> <span> 获取以后遍历次数 </span> <span>-</span>

在您理解本人输入的表构造的状况下,您能够应用如下变量形式,获取其余变量取值。

<span> 其余变量 </span> <span> 含意 </span>
<span>${dag.foreach.current[n]}</span></strong></td><td><span> 上游赋值节点的输入后果为二维数组时,每次遍历时获取以后数据行的某列的数据。</span></td></tr><tr><td><strong><span>${dag.loopDataArrayi}</span> <span> 上游赋值节点的输入后果为二维数组时,获取数据集中具体 i 行 j 列的数据。</span>
<span>${dag.foreach.current[n]}</span> <span> 上游赋值节点的输入后果为一维数组时,获取具体某列数据。</span>

## 2.5 内置变量取值案例

* 案例 1

上游赋值节点为 shell 节点,最初一条输入后果为2021-03-28,2021-03-29,2021-03-30,2021-03-31,2021-04-01,此时,各变量的取值如下:

阐明 因为输入后果为一维数组,数组元素个数为 5(逗号分隔每个元素),因而 for-each 总遍历次数为 5。

<span> 内置变量 </span> <span> 第 1 次循环遍历的取值 </span> <span> 第 2 次循环遍历的取值 </span>
<span>${dag.loopDataArray}</span></strong></td><td colspan=”2″><strong><span>2021-03-28,2021-03-29,2021-03-30,2021-03-31,2021-04-01</span></strong></td></tr><tr><td><strong><span>${dag.foreach.current}</span> <span>2021-03-28</span> <span>2021-03-29</span>
<span>${dag.offset}</span></strong></td><td><span>0</span></td><td><span>1</span></td></tr><tr><td><strong><span>${dag.loopTimes}</span> <span>1</span> <span>2</span>
<span>${dag.foreach.current[3]}</span> <span>2021-03-30</span>

* 案例 2

上游赋值节点为 ODPS SQL 节点,最初一条 select 语句查问出两条数据:

+----------------------------------------------+

​ | uid            | region | age_range | zodiac | ​

+----------------------------------------------+

​ | 0016359810821  | 湖北省 | 30~40 岁   | 巨蟹座 | ​

| 0016359814159  | 未知   | 30~40 岁   | 巨蟹座 | ​

+----------------------------------------------+

此时,各变量的取值如下:

阐明 因为输入后果为二维数组,数组行数为 2,因而 for-each 总遍历次数为 2。

<span> 内置变量 </span> <span> 第 1 次循环遍历的取值 </span> <span> 第 2 次循环遍历的取值 </span>
<span>${dag.loopDataArray}</span></strong></td><td colspan=”2″><code>+———————————————-+</code><code>&nbsp;| uid &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| region | age_range | zodiac |&nbsp;</code><code>+———————————————-+</code><code>&nbsp;| 0016359810821 &nbsp;| 湖北省 | 30~40 岁 &nbsp; | 巨蟹座 |&nbsp;</code><code>| 0016359814159 &nbsp;| 未知 &nbsp; | 30~40 岁 &nbsp; | 巨蟹座 |&nbsp;</code><code>+———————————————-+</code></td></tr><tr><td><strong><span>${dag.foreach.current}</span> <span>0016359810821, 湖北省,30~40 岁, 巨蟹座 </span> <span>0016359814159, 未知,30~40 岁, 巨蟹座 </span>
<span>${dag.offset}</span></strong></td><td><span>0</span></td><td><span>1</span></td></tr><tr><td><strong><span>${dag.loopTimes}</span> <span>1</span> <span>2</span>
<span>${dag.foreach.current[0]}</span></strong></td><td><strong><span>0016359810821</span></strong></td><td><strong><span>0016359814159</span></strong></td></tr><tr><td><strong><span>${dag.loopDataArray1}</span> <span>0016359814159</span>

> 版权申明:本文内容由阿里云实名注册用户自发奉献,版权归原作者所有,阿里云开发者社区不领有其著作权,亦不承当相应法律责任。具体规定请查看《阿里云开发者社区用户服务协定》和《阿里云开发者社区知识产权爱护指引》。如果您发现本社区中有涉嫌剽窃的内容,填写侵权投诉表单进行举报,一经查实,本社区将立即删除涉嫌侵权内容。

正文完
 0