DAYU数据开发For Each算子操作指导

举报
Vking 发表于 2020/08/24 20:45:33 2020/08/24
【摘要】 当用户在DAYU数据开发上进行作业的开发编排的时候,有时会有如下场景:我有一批任务,它们的配置中只有几个参数是不一致的,其余的参数全部都一样。那我是否能定义一个模板任务,对模板任务中要变化的参数定义成变量,然后把所有参数值都定义在一个数据集中,每次从数据集中取出数据,循环替换模板任务中的变量?答案是可以。DAYU数据开发中的For Each算子可以满足用户的该需求,For Each算子可以指...

当用户在DAYU数据开发上进行作业的开发编排的时候,有时会有如下场景:我有一批任务,它们的配置中只有几个参数是不一致的,其余的参数全部都一样。那我是否能定义一个模板任务,对模板任务中要变化的参数定义成变量,然后把所有参数值都定义在一个数据集中,每次从数据集中取出数据,循环替换模板任务中的变量?

答案是可以。DAYU数据开发中For Each算子可以满足用户的该需求,For Each算子可以指定一个子作业循环执行,并支持用一个数据集对子作业中的变量进行循环替换。下面介绍For Each算子的操作指导。

1.  For Each算子参数释义

  •  循环执行的子作业:要循环执行的子作业,即上文提到的要预先定义好的“模板任务”。

  • 数据集:For循环算子需要定义一个数据集,这个数据集用来循环替换子作业中的变量,数据集的一行数据会对应一个子作业实例。这个数据集的来源(1)来自于上游节点的输出,比如DLI SQLHive SQLselect语句;(2)来自于一个CSV格式的文件。

  •  子作业并发数:循环产生的子作业可以并发执行,并发数由用户来配置。

  • 生成子作业后缀:For循环生成的子作业实例的规则是 子作业名 + 下划线 + 后缀,后缀可以配置成数据集中的参数,如果不指定该参数,就按照数字顺序依次递增。

  •   作业运行参数:子作业中定义的变量,在For循环算子中,可以配置为数据集中的某一列,也可以配置成一个固定值。


For Each算子会有几个特有的EL表达式:

#{loop.dataArray} For循环算子输入的数据集,是一个二维数组;

#{loop.current}:由于For循环算子在处理数据集的时候,是一行一行进行处理的,那loop.current就表示当前处理到的某行数据,loop.current是一个一维数组,一般定义格式为#{loop.current[0]}#{loop.current[1]}或其它,0表示遍历到当前行的第一个值;

#{loop.offset}For循环算子在处理数据集时当前的偏移量,从0开始;

关系:loop.dataArray[loop.offset] = loop.current

2.       定义要循环运行的子作业

1中介绍了For Each算子的参数,在配置For Each算子的时候,首先要定义一个循环运行的子作业。在本次操作中,定义循环执行的是一个包含了DWS SQL节点的任务:

DWS SQL的语句中把要替换的变量配成${}这种参数的形式。在下面的SQL语句中,所做的操作是手动对dws_table这个表根据TripID字段做了分区,在SQL中,${table}${start}${end} 就是要替换的参数:

配置好SQL语句后,在子作业中配置作业参数:

这里子作业的参数值不用配置具体的值,主要作用是让For Each算子知道这个子作业有哪些作业参数。

3.配置数据集

For Each算子的数据集可以来源于SQL语句的输出,也可以来源于一个CSV文件,这里以DLI SQL节点为例:首先准备好一个临时表,在临时表里准备好子作业的变量要替换的值。在本次操作中,临时表的数据如下图所示:

4.       配置For Each算子

在准备好子作业和数据集后,就可以配置For Each算子了。新建一个数据开发任务,首先定义DLI SQL节点,负责读取临时表中的内容作为数据集:

然后配置For Each节点:

  • “循环执行的子作业”就选择之前定义好的子作业。

  • 数据集来源于上游的DLI SQL节点,所以使用EL表达式#{Job.getNodeOutput("data_output")} 来获取DLI SQL节点的select输出结果。

  • 子作业实例后缀名称,这里指定的是#{Loop.current[0]},也就是For Each算子遍历到当前数据行的第一列,根据3中数据集可以知道,第一列就是参数中的表名。

  • 作业运行参数:table对应的是数据集的第一列,start是第二列,end是第三列,所以配置的EL表达式分别是#{Loop.current[0]}#{Loop.current[1]}#{Loop.current[2]}

5.       测试运行作业并查看监控

  配置好For Each节点任务后,点击保存后并测试运行,然后点击“前往监控”,就可以查看作业的运行情况:


    等待任务运行成功后,就能查看For Each节点生成的子作业实例,由于我们数据集中有4行数据,所以这里就对应产生了4个子作业实例,点击其中第一个子作业实例,就能跳转到查看日志页面:

点击“查看日志”按钮,就能看到第一个子作业实例的执行日志:

    可以看到红框中,在子作业的DWS SQL中定义的变量已经被替换为数据集第一行的数据。同理,第二个子作业实例的变量对应的是数据集的第二行数据。也就对应了上文所说的,数据集中的一行数据会产生一个子作业实例。

6.       其它内容

步骤3中介绍了数据集是来源于SQL输出,那如果用户的数据集是存在一个CSV文件中,该怎么操作呢?答案是通过创建外表。如果该CSV文件是放在OBS上,可以通过DLI SQL或者DWL SQL创建OBS外表关联这个CSV文件,然后查询OBS外表得到;如果该CSV文件是放在HDFS上,则可以通过创建hive sql创建hive外表,然后查询该hive外表得到。创建外表的SQL语句可以查看其它服务的帮助文档。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。