简介:DataWorks功能实践系列,帮助您解析业务实现过程中的痛点,提高业务功能使用效率!通过往期的介绍,您已经了解到在DataWorks上进行任务运行的最关键的几个知识点,其中上期参数透传中为您介绍了可以将上游节点参数透传到下游节点的特殊节点——赋值节点,结合赋值节点和其他节点,可实现循环或遍历读取处理数据的任务。本期为您介绍如何在DataWorks上实现循环与遍历任务。

往期回顾:

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

通过往期的介绍,您已经了解到在DataWorks上进行任务运行的最关键的几个知识点,其中上期参数透传中为您介绍了可以将上游节点参数透传到下游节点的特殊节点——赋值节点,结合赋值节点和其他节点,可实现循环或遍历读取处理数据的任务。本期为您介绍如何在DataWorks上实现循环与遍历任务。

功能推荐:循环节点与遍历节点

在进行数据开发任务编译的过程中,有时我们可能碰到需要进行循环或遍历的任务场景,DataWorks为您提供两类特殊节点以满足此类场景的使用需求。

对比项

循环节点(do-while节点)

遍历节点(for-each节点)

应用场景

根据对象集合的数量逐条读取并判断是否满足循环条件,如果满足则继续循环,如果不满足则退出循环,循环次数根据每次循环的判断结果而定,不固定。

根据对象集合的数量逐条读取(遍历),循环次数已知。

节点应用

您可以重新编排do-while节点内部的业务流程,将需要循环执行的逻辑写在节点内,再编辑end循环判断节点来控制是否退出循环。同时您也可以结合赋值节点来循环遍历赋值节点传递的结果集。

您可以通过for-each节点来循环遍历赋值节点传递的结果集。同时您也可以重新编排for-each节点内部的业务流程。

通常循环节点(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节点,通过内部节点来实现循环运行任务,每次任务循环运行时,您可以通过一些内置的变量来获取当前已循环次数和偏移量。

内置变量

含义

取值

${dag.loopTimes}

当前已循环次数

第一次循环为1、第二次为2、第三次为3…第n次为n。

${dag.offset}

偏移量

第一次循环为0、第二次为1、第三次为2…第n次为n-1。

如果您联合使用了赋值节点,则还可以通过以下方式来获取赋值参数值和循环变量参数。

说明以下以变量示例中,input是do-while节点中自定义的本节点输入参数名称,实际使用时,需替换为您真实的名称。

内置变量

含义

${dag.input}

上游赋值节点传递的数据集。

${dag.input[${dag.offset}]}

循环节点内部获取当前循环的数据行。

${dag.input.length}

循环节点内部获取数据集长度。

1.5 变量取值案例

  • 案例1

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

内置变量

第1次循环时取值

第2次循环时取值

${dag.input}

2021-03-28,2021-03-29,2021-03-30,2021-03-31,2021-04-01

${dag.input[${dag.offset}]}

2021-03-28

2021-03-29

${dag.input.length}

5

${dag.loopTimes}

1

2

${dag.offset}

0

1

  • 案例2

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

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

| uid            | region | age_range | zodiac |

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

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

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

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

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

内置变量

第1次循环时取值

第2次循环时取值

${dag.input}

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

| uid            | region | age_range | zodiac |

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

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

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

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

${dag.input[${dag.offset}]}

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

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

${dag.input.length}

2

说明 二维数组的行数为数据集长度,当前赋值节点输出的二维数组行数为2。

${dag.input[0][1]

说明 二维数组的第一行第一列的取值。

0016359810821

${dag.loopTimes}

1

2

${dag.offset}

0

1

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节点每次循环遍历赋值节点的输出结果时,您可以通过一些内置的变量来获取当前已循环次数和偏移量。

内置变量

含义

与for循环对比

${dag.loopDataArray}

获取赋值节点的数据集

相当于for循环中的代码结果:

data=[]

${dag.foreach.current}

获取当前遍历值

以下面的for循环代码为例:

for(int i=0;i<data.length;i++) { print(data[i]); }

  • data[i]相当于${dag.foreach.current}
  • i相当于${dag.offset}

${dag.offset}

当前偏移量

(每一次遍历相对于第一次的偏移量)

${dag.loopTimes}

获取当前遍历次数

-

在您了解自己输出的表结构的情况下,您可以使用如下变量方式,获取其他变量取值。

其他变量

含义

${dag.foreach.current[n]}

上游赋值节点的输出结果为二维数组时,每次遍历时获取当前数据行的某列的数据。

${dag.loopDataArray[i][j]}

上游赋值节点的输出结果为二维数组时,获取数据集中具体i行j列的数据。

${dag.foreach.current[n]}

上游赋值节点的输出结果为一维数组时,获取具体某列数据。

2.5 内置变量取值案例

  • 案例1

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

说明 由于输出结果为一维数组,数组元素个数为5(逗号分隔每个元素),因此for-each总遍历次数为5。

内置变量

第1次循环遍历的取值

第2次循环遍历的取值

${dag.loopDataArray}

2021-03-28,2021-03-29,2021-03-30,2021-03-31,2021-04-01

${dag.foreach.current}

2021-03-28

2021-03-29

${dag.offset}

0

1

${dag.loopTimes}

1

2

${dag.foreach.current[3]}

2021-03-30

  • 案例2

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

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

 | uid            | region | age_range | zodiac | 

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

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

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

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

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

说明 由于输出结果为二维数组,数组行数为2,因此for-each总遍历次数为2。

内置变量

第1次循环遍历的取值

第2次循环遍历的取值

${dag.loopDataArray}

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

 | uid            | region | age_range | zodiac | 

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

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

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

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

${dag.foreach.current}

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

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

${dag.offset}

0

1

${dag.loopTimes}

1

2

${dag.foreach.current[0]}

0016359810821

0016359814159

${dag.loopDataArray[1][0]}

0016359814159

原文链接:https://developer.aliyun.com/article/793529?

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

DataWorks功能实践速览 05——循环与遍历相关推荐

  1. DataWorks功能实践速览 — 参数透传

    简介: DataWorks功能实践系列,帮助您解析业务实现过程中的痛点,提高业务功能使用效率! 往期回顾: DataWorks 功能实践速览01期--数据同步解决方案:为您介绍不同场景下可选的数据同步 ...

  2. DataWorks功能实践速览

    简介:DataWorks功能实践系列,帮助您解析业务实现过程中的痛点,提高业务功能使用效率! 往期回顾:DataWorks 功能实践速览01期--数据同步解决方案 功能推荐:独享数据集成资源组 如上期 ...

  3. DataWorks 功能实践速览03期 — 生产开发环境隔离

    简介: DataWorks功能实践系列,帮助您解析业务实现过程中的痛点,提高业务功能使用效率! 往期回顾: DataWorks 功能实践速览01期--数据同步解决方案:为您介绍不同场景下可选的数据同步 ...

  4. DataWorks 功能实践速览

    简介: DataWorks功能实践系列,帮助您解析业务实现过程中的痛点,提高业务功能使用效率! 功能推荐:独享数据集成资源组 如上期数据同步解决方案介绍,数据集成的批数据同步任务运行时,需要占用一定的 ...

  5. DataWorks 功能实践 — 生产开发环境隔离

    简介:DataWorks功能实践系列,帮助您解析业务实现过程中的痛点,提高业务功能使用效率! 往期回顾: DataWorks 功能实践速览01期--数据同步解决方案:为您介绍不同场景下可选的数据同步方 ...

  6. GitHub 热点速览 Vol.23:前后端最佳实践

    作者:HelloGitHub-小鱼干 摘要:最佳实践,又名 best-practices,是 GitHub 常见的项目名,也是本周 Trending 关键词.25 年 Python 开发经验的 Dav ...

  7. Win系统速览桌面功能失效 - 解决方案

    Win系统速览桌面功能失效 - 解决方案 问题 解决方案 步骤1:确保显卡驱动正常运行 步骤2:检查任务栏设置 步骤3:调整视觉效果 问题 Win10系统支持用户鼠标悬停在任务栏右下角时速览桌面.但可 ...

  8. 十月 Z 星月度速览 | Hacktoberfest 开源挑战赛、飞书深诺电商场景实践、Paddlepaddle推荐系统部署……...

    #October Z星月度速览 · Milvus 社区举办第九届 Arch Meetup,与极狐 GitLab 共同分享开源 AI 企业级解决方案和场景经验 · 欢庆 1024,Zilliz 合伙人. ...

  9. 九月 Z 星月度速览 | Hacktoberfest 开源挑战赛、飞书深诺电商场景实践、Paddlepaddle推荐系统部署……...

    #September Z星月度速览 · Milvus Hacktoberfest 开源挑战赛正式开启,神秘大奖等你来拿! · Paper reading 第三期:基于近邻图的高维向量近似最近邻检索算法 ...

最新文章

  1. Android 自定义圆形图片 CircleImageView
  2. Cannot create file Altium\AD15\Library\BSDL\Generic\BSDL_FileMap.txt.拒绝访问
  3. httpservletrequest_javax.servlet.http.HttpServletRequest报错
  4. AutoComplete选择之后,传PK触发动作
  5. 计算机视觉开源库OpenCV之绘制轮廓函数cv2.drawContours()介绍
  6. 爱情麻辣烫防骗子—骗子谎称学生出事让家长汇款
  7. 使用ThreadLocal不当可能会导致内存泄露
  8. matlab两张图片合成一张_两张图片合成一幅画意作品的简单方法
  9. 数据结构之线性表的基本C语言语法
  10. kafka sink mysql,kafka之七 sinkTask详解
  11. 基于Geoserver配置多图层地图以及利用uDig来进行样式配置
  12. 一步一步写算法(之排序二叉树的保存和加载)
  13. C#-Event事件
  14. 《Machine Learning in Action》—— 浅谈线性回归的那些事
  15. html数独游戏源代码,数独算法及源代码
  16. 【RS-Attack】攻击MF:Data Poisoning Attacks on Factorization-Based Collaborative Filtering (NIPS‘16)
  17. 运维必看:低成本数据异地灾备方案
  18. 电商在线支付学习摘录
  19. 《这个男人来自地球》台词
  20. Matlab 泰勒图

热门文章

  1. elasticsearch mapping之fields
  2. 程序员公开上班摸鱼神器!有了它,老板都不好意思打扰你!
  3. 火了!16岁高中生做的 Python 3.9 八大新特性图
  4. 强烈推荐:程序员必备的两个超级工具,一个是百宝箱,一个是百宝库
  5. 他修复了程序员吃饭的bug,估值已超过10亿美金!9.9元,2顿饭.....
  6. python读文本文件的过程是怎样的_读写文本文件的步骤_Python读写txt文本文件的操作方法全解析...
  7. 机器手六维坐标怎么定义_工业机器人十万个怎么办-不清楚机器人各坐标系含义怎么办?...
  8. python的进程模块
  9. ubuntu16.04安装cuda8./9.
  10. golang mysql demo