DataWorks功能实践速览 05——循环与遍历

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

1.png

往期回顾:

  • 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个内部节点,同时您也可以将内部节点重新进行内部业务流程和节点内容的编译。

2.png

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

1.1 节点组成

DataWorks的do-while节点是包含内部节点的一种特殊节点,您在创建完成do-while节点时,同时也自动创建完成了三个内部节点:start节点(循环开始节点)、sql节点(循环任务节点)、end节点(循环结束判断节点),通过内部节点组织成内部节点流程,实现任务的循环运行。

3.png

如上图所示:

  • 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节点常常与赋值节点联合使用,如下图所示。

4.png

与赋值节点联合使用时:

  • 您需要将赋值节点的输出作为赋值节点的本节点输入,且与赋值节点做好上下游依赖关系的配置,其他配置注意事项请参见案例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节点(循环结束判断节点),通过内部节点组织成内部节点流程,实现对上游赋值接节点输出结果的循环遍历。

5.png

如上图所示:

  • 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节点后,一次次循环来遍历赋值节点的输出结果。

6.png

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

原文链接

本文为阿里云原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/512246.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里安全开源顶尖技术“猎豹” 计算更快数据更安全

两家公司想开展合作&#xff0c;发挥各自优势联合开发一款产品&#xff0c;如何以“隐私计算”的形式&#xff0c;在保护隐私的情况下&#xff0c;高效地实现两方联合计算&#xff0c;便成为解决这一问题的关键。 最近&#xff0c;阿里安全最新研发的Cheetah&#xff08;猎豹&…

PaddlePaddle:在 Serverless 架构上十几行代码实现 OCR 能力

简介&#xff1a; 飞桨深度学习框架采用基于编程逻辑的组网范式&#xff0c;对于普通开发者而言更容易上手&#xff0c;同时支持声明式和命令式编程&#xff0c;兼具开发的灵活性和高性能。 飞桨 (PaddlePaddle) 以百度多年的深度学习技术研究和业务应用为基础&#xff0c;是中…

云原生体系下 Serverless 弹性探索与实践

简介&#xff1a; SAE 通过对弹性组件和应用全生命周期的不断优化以达到秒级弹性&#xff0c;并在弹性能力&#xff0c;场景丰富度&#xff0c;稳定性上具备核心竞争力&#xff0c;是传统应用 0 改造上 Serverless 的最佳选择。 作者&#xff1a;竞霄 Serverless 时代的来临 …

java jndi使用_Java项目中使用JNDI连接数据库

因为写的大作业经常用到数据库连接 所以自己写了个数据库连接的类 package DB_Link_info;/* * 数据库链接信息 */public class DB_link_Info {public static final String driverName "com.microsoft.sqlserver.jdbc.SQLServerDriver";public static开发环境为Java,…

Joint Consensus两阶段成员变更的单步实现

简介&#xff1a; Raft提出的两阶段成员变更Joint Consensus是业界主流的成员变更方法&#xff0c;极大的推动了成员变更的工程应用。但Joint Consensus成员变更采用两阶段&#xff0c;一次变更需要提议两条日志&#xff0c; 在一些系统中直接使用时有些不便。那么Joint Consen…

真香!8 行代码搞定最大子数组和问题

作者 | 码农的荒岛求生来源 | 码农的荒岛求生今天给大家带来一道极其经典的题目&#xff0c;叫做最大和子数组&#xff0c;给定一个数组&#xff0c;找到其中的一个连续子数组&#xff0c;其和最大。示例&#xff1a;输入: nums [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 子数组…

深度干货|云原生分布式数据库 PolarDB-X 的技术演进

简介&#xff1a; 深入解读PolarDB-X的产品架构&#xff0c;以及分布式事务、透明分布式、水平扩展等技术内幕。 一、PolarDB-X是什么 PolarDB-X最早起源于阿里集团2009年提出用分布式架构替代传统商业数据库&#xff0c;阿里研发了TDDL分库分表中间件。2014年阿里集团开始全…

OpenStack 如何跨版本升级

作者 | 孙琦来源 | 万博智云OpenStack是中国私有云的事实标准根据三方统计报告&#xff0c;2020年&#xff0c;中国私有云市场规模达到951.8亿元&#xff0c;同比增长42.1%&#xff0c;私有云在国内IaaS市场占比约45%。私有云提供商有望在云计算市场持续高速发展进程中持续受益…

流计算引擎数据一致性的本质

简介&#xff1a; 本篇文章从流计算的本质出发&#xff0c;重点分析流计算领域中数据处理的一致性问题&#xff0c;同时对一致性问题进行简单的形式化定义&#xff0c;提供一个一窥当下流计算引擎发展脉络的视角&#xff0c;让大家对流计算引擎的认识更为深入&#xff0c;为可能…

java 的io流需要学吗_Java的IO流之字节流,必须要学得内容,你会嘛?

原标题&#xff1a;Java的IO流之字节流&#xff0c;必须要学得内容&#xff0c;你会嘛&#xff1f;伙伴们~端午节过的如何呀~有没有很开心呀~假期已过咱们继续开动了IO流先来认识一下IO流&#xff1a;IO流用来处理设备之间的数据传输&#xff0c;Java对数据的操作是通过流的方式…

为什么大家都在抵制用定时任务实现「关闭超时订单」功能?

作者 | 阿Q来源 | 阿Q说代码前几天领导突然宣布几年前停用的电商项目又重新启动了&#xff0c;让我把代码重构下进行升级。让我最深恶痛觉的就是里边竟然用定时任务实现了“关闭超时订单”的功能&#xff0c;现在想来&#xff0c;哭笑不得。我们先分析一波为什么大家都在抵制用…

面对疾风吧,如何搭建高协同的精准告警体系?

简介&#xff1a; 想要实现AiOps&#xff0c;智能告警少不了。Arms 告警运维中心让面向告警的组织协同更加便捷高效&#xff01; 作者&#xff5c;九辩 世上没有一个系统是百分之百尽善尽美的。如果想要保证可用性&#xff0c;那么技术团队就得对服务的各种状态了如指掌&…

KubeMeet|聊聊新锐开源项目与云原生新的价值聚焦点

简介&#xff1a; 10 月 16 日上海&#xff0c;OAM/KubeVela、OpenKruise、OCM 三大开源项目的社区负责人、核心贡献者和企业用户将齐聚 KubeMeet&#xff0c;和现场 100 名开发者聊聊新的技术环境和企业需求下&#xff0c;有关“云原生应用管理”的那些事儿。 随着云原生关注…

Redis 究竟适不适合当队列来用?

‍作者 | Magic Kaito来源 | 水滴与银弹我经常听到很多人讨论&#xff0c;关于「把 Redis 当作队列来用是否合适」的问题。有些人表示赞成&#xff0c;他们认为 Redis 很轻量&#xff0c;用作队列很方便。也些人则反对&#xff0c;认为 Redis 会「丢」数据&#xff0c;最好还是…

EDA 事件驱动架构与 EventBridge 二三事

简介&#xff1a; 事件驱动型架构 (EDA) 方兴未艾&#xff0c;作为一种 Serverless 化的应用概念对云原生架构具有着深远影响。当我们讨论到一个具体架构时&#xff0c;首当其冲的是它的发展是否具有技术先进性。这里从我们熟悉的 MVC 架构&#xff0c;SOA 架构谈起&#xff0c…

如果被问到分布式锁,应该怎样回答?

作者 | tech-bus.七十一来源 | 程序员巴士说到锁&#xff0c;在平时的工作中&#xff0c;主要是使用synchronized关键字&#xff0c;或者相关的一些类库来实现同步&#xff0c;但这都是基于单机应用而言的&#xff0c;当我们的应用多实例部署时&#xff0c;这时候就需要用到分布…

工业视觉智能实战经验之IVI算法框架2.0

简介&#xff1a; 工业视觉智能团队在交付了多个工业视觉智能质检项目后&#xff0c;发现了工业视觉智能的共性问题和解法&#xff0c;打造了工业视觉智能平台&#xff0c;通过平台的方式积累和提升工业视觉的通用能力。在平台建设上最核心的能力是算法能力。算法能力包括不断增…

技术干货 | jsAPI 方式下的导航栏的动态化修改

简介&#xff1a; 操作指导&#xff1a;通过 jsAPI 实现导航栏的动态修改。 很多开发同学在接入 H5 容器后都会对容器的导航栏进行深度定制&#xff0c;除了 Native 的定制化之外&#xff0c;还有很多场景是使用到 jsAPI 的方式&#xff0c;通过 jsAPI 实现导航栏的动态修改。 …

Gartner:企业机构需重新定义网络安全领导者角色

编辑 | 宋慧 供稿 | Gartner 根据Gartner的最新调查&#xff0c;由于网络风险责任已被转移到IT以外&#xff0c;并且日益分散的生态系统导致网络安全领导者正在失去对决策的直接控制权&#xff0c;企业机构需要重新定义网络安全领导者的角色。 如今&#xff0c;安全和风险管理…

成本直降50%,下一代网关震撼发布

简介&#xff1a; 在容器和K8s主导的云原生时代&#xff0c;网关的新形态变得逐渐清晰&#xff0c;阿里内部也孵化出了下一代的网关产品 - 云原生网关&#xff0c;已在支付宝、淘宝、优酷、口碑等业务成功上线&#xff0c;并且经历了2020双11大促海量请求的考验&#xff0c;目前…