简介: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节点循环次数,其本质上是一个赋值节点,输入true和false两种字符串,别离代表持续下一个循环和不再持续循环。 * 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 | region | age_range | zodiac |</code><code>+----------------------------------------------+</code><code>| 0016359810821 | 湖北省 | 30~40岁 | 巨蟹座 |</code><code>| 0016359814159 | 未知 | 30~40岁 | 巨蟹座 |</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> | uid | region | age_range | zodiac | </code><code>+----------------------------------------------+</code><code> | 0016359810821 | 湖北省 | 30~40岁 | 巨蟹座 | </code><code>| 0016359814159 | 未知 | 30~40岁 | 巨蟹座 | </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> > 版权申明:本文内容由阿里云实名注册用户自发奉献,版权归原作者所有,阿里云开发者社区不领有其著作权,亦不承当相应法律责任。具体规定请查看《阿里云开发者社区用户服务协定》和《阿里云开发者社区知识产权爱护指引》。如果您发现本社区中有涉嫌剽窃的内容,填写侵权投诉表单进行举报,一经查实,本社区将立即删除涉嫌侵权内容。