DAYU数据开发For Each算子操作指导
当用户在DAYU数据开发上进行作业的开发编排的时候,有时会有如下场景:我有一批任务,它们的配置中只有几个参数是不一致的,其余的参数全部都一样。那我是否能定义一个模板任务,对模板任务中要变化的参数定义成变量,然后把所有参数值都定义在一个数据集中,每次从数据集中取出数据,循环替换模板任务中的变量?
答案是可以。DAYU数据开发中的For Each算子可以满足用户的该需求,For Each算子可以指定一个子作业循环执行,并支持用一个数据集对子作业中的变量进行循环替换。下面介绍For Each算子的操作指导。
1. For Each算子参数释义
循环执行的子作业:要循环执行的子作业,即上文提到的要预先定义好的“模板任务”。
数据集:For循环算子需要定义一个数据集,这个数据集用来循环替换子作业中的变量,数据集的一行数据会对应一个子作业实例。这个数据集的来源(1)来自于上游节点的输出,比如DLI SQL、Hive SQL的select语句;(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语句可以查看其它服务的帮助文档。
- 点赞
- 收藏
- 关注作者
评论(0)