开发者学堂课程【DataWorks 一站式大数据开发治理平台精品课程:3.DataWorks 调度参数配置】与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/81/detail/1240
3.DataWorks 调度参数配置(二)
三、注意事项
1、三种运行赋值逻辑说明
一个是运行,一个是高级运行,还有一个是开发环境冒烟测试。
(1)选择运行,只会在第一次弹框时给当前的变量赋值常量。如果修改了代码中变量名是不会继续弹框给新变量赋值。
(2)选择高级运行,每次都会弹框给当前变量赋值。
(3)如果您变更了代码中的变量,或者需要重新为变量赋值,请务必
使用高级运行。
代码里面已经看起来是没有问题的,为什么赋值情况还是不对呢?那是因为直接选择运行时,它还是记录了第一次运行时候的变量名和赋值情况。所以如果修改了代码中的变量,或者是需要重新给变量赋值,一定要选择高级运行,给当前的变量赋值常量。需要注意,运行和高级运行是给代码中的变量赋值常量,因为调度参数只有走调度时才会替换。
2、两类运行赋值区别
(1)选择运行或者高级运行,请在弹框中给代码中的变量赋值常量。
(2)如果想测试当前参数这里估值情况是不是预期的那样,使用开发环境冒烟测试,根据业务时间替换调度参数;若修改了调度参数赋值,请务必先保存提交,再使用开发环境冒烟测试。
(3)如果需要测试调度参数替换情况,请使用开发环境冒烟测试。
(4)如果您变更了代码中的变量,或者需要重新为变量赋值,请务必
使用高级运行。不会校验右侧的调度参数的配置它的格式是怎么样的。所以如果要测试调度参数,可以使用开发环境冒烟测试。需要注意,如果修改了调度参数的赋值,一定要先保存提交,再使用开发环境冒烟测试功能。因为保存操作是不会将代码提交到开发环境的,开发环境冒烟测试又测试的是开发环境该节点的代码情况,所以如果要使用开发环境冒烟测试,一定要先保存提交,再使用开发环境冒烟测试。
3、赋值注意事项
(1)调度参数赋值中不支持空格
- time①=②$yyymmdd③hh24:mi:ss]等号两边是不能够带空格,赋值里面不能带空格。
- time1=$[yyymmdd]④time2=$[hh24:mi:ss]两个参数之间可以用一个空格。
- ①②③④为空格所在位置
(2)${...}取业务时间,最小粒度天
(3)$[..]取定时时间,可精确到时分秒
(4)注意
- 调度参数的等号(= )两端不可以加空格,即示例中的①②处。
- 调度参数赋值中不支持空格,即示例中的③处。
- 两个调度参数间用一个空格分隔,即示例中的④处。
四、常见的使用场景
1、场景一:如何处理表的分区格式中需要空格的情况
解决方案:
(1)参数赋值区:使用两个自定义变量参数分别取年月日,时分秒datetime = $[yyyy-mm-dd] hour= $[hh24:miss]
(2)代码调用区:在代码中用空格拼接两个参数。
pt=${datetime} ${hour}
如果直接使用一个参数,也就是time①=②$yyymmdd③hh24:mi:ss]格式,等调度替换出来时,会发现中间加的这一个空格被默认的就被默认掉了。调度参数是不支持带空格的,所以如果要实现年月日时分秒钟带一个空格,需要用两个参数来做,一个参数取年月日,一个参数取十分秒,在代码里面用一个空格拼接两个参数,这样就可以实现代码中替换出来的值中带一个空格。
2、场景二:跨天调度参数替换
如何处理0点运行的实例,计算结果变为当天的23点,实际应当是前一天的23点的情况?
(1)问题描述:
在代码中表的分区为pt= ${datetime} ${hour} ,希望执行时获取上个小时的数据。使用两个自定义变量参数datetime= $[yyymmdd].hour= $[hh24-1/24]可以满足需求。但是0点运行的实例,计算结果会变成当天的23点,实际应当是前一天的23点。比如两点运行的任务,那天这样取还是当天小时往前取一个小时,那替换就是一,但是在0点时计算结果,因为天0点还是在当天,计算结果会变成当天的23点,那实际上取天时应该往前推一天才对,应该是前一天的23点。
(2)解决方法:
可以修改参数的计算公式,修改datetime为$yyymmdd-1/24] , hour的计算公式仍然是$[hh24-1/24]。计算结果如下,即可满足需求:
- 如果一个实例的定时时间是2015-10-27 00:00:00 ,减1小时便是昨天,则$yyymmdd-1/24]的值是20151026. $[hh24-1/24]的值是23。
- 如果一个实例的定时时间为2015-10-27 01:00:00的实例,减1小时还是今天,则$yyymmdd-1/24]的值是20151027、$[hh24-1/24]的值是00。
五、实操演练
1、针对两个参数,看一下替换情况。bizdate取的是业务时间,cyc time取的是任务的定时时间,任务的定时时间实际上就是具体时间,假设现在是00:00,十分秒应该是00:00,查看它的参数替换情况,选择开发环境冒烟测试,测试这两个参数的替换情况,这两个参数是代码中直接使用,不需要再赋值,选择业务时间假设是10月1号。
1.开放环境冒烟测试,选择的业务时间,十月1号,bdp.system.bizdate的取值是2020 10月1号,bdp.system.cyctime 的取值是2020年10月2号,年月日是10月2号,小时分钟是0.00。查看它实际运行的结果,这是第一段sql。这替换出来的值是刚选择的业务时间,没有问题,取 cyctime 是10月2号0.00,这里也没有问题,cyctime取的是具体时间,现在再修改任务的定时时间,再看它的参数替换是否符合场景。这时 cyctime 的参数取值应该是1:00,已经切换出来,是2020年10月2号1点00分00秒。dataworks 任务的定时时间和实际运行时间可能不是完全一致的,任务定时时间和实际运行时间可能是存在差异的。定时时间可以理解为任务的理想时间点,运行的理想时间点,但是可能会由于上游任务执行的晚,或者是当前项目没有资源等待资源,导致任务开始实际运行的时间延迟了。需要注意的是取任务定时时间,值是不会变的,它是跟随实例它是绝对的,如果它是当天的第一个实例,它的定时时间在实例生成时就已经固定了,取任务定时时间时,它的值也是固定的,不会跟随任务实际运行时间改变。
2.再查看自定义参数大括号的格式,先直接运行,同样取十月十号,看它的取值是什么样的。当前取了6个参数,1个是 bizdate,1个是年月日整个参数,一个是年份,月份和天,单独取的。
3.同样选择10月1号。如果是自定义参数,直接看它的参数有没有被正常替换。刚取的bizdate 等于20201001,值没有问题,bizdate和${yyyy-mm-dd}里的取值是一样的,所以也可以看到它俩的取值是一样的。第三个参数是直接取了年份,第二个取的是月份,第三个取的是天,这三个也是没有问题的。如果往前取一年,往前取一个月,往前取一天,如果要取年月,这样往前多少年多少月,那一定要使用使用大括号的格式,直接看上面。业务时间选择的是2020年10月1号,那现在年份往前取了一年,月份也往前取了一个月,天也是上个月末,这样看时间跨天的情况也是没有问题的。再查看中括号的格式,中括号这里同样的,变量名使用 cyctime,但是 cyctime 一定要记得在右侧这里给它再赋值 cyctime,它的取值跟$[yyyy-mm-dd]加上小时是一样的,它可以取到具体的时分秒。第二个参数单独取天,第三个参数取的是小时分钟和秒,先单独的执行,不加任何的加减场景,同样取10月1号,可以看到 cyctime,业务时间选择的10月1号,参数替换取的是11月2号,定时时间,分钟是29分,参数替换没有问题,这里多了[yyyy-mm-dd]取的是10月2号,00:29:00,没有问题,同样往前取,可以往前取一个小时。单独看参数的替换情况,修改了代码变量时,一定要先保存提交,再使用开发环境冒烟测试,现在是00:29分任务定时时间,业务时间选择10月1号,往前取一个小时应该是23点多少分。
4.看具体的场景,赋值中需要带空格的情况。调度参数,如果加上空格是错误的示例,观察现象,一定要记得保存提交再使用开发环境冒烟测试。虽然在变量中加了一个空格,但是替换出来的值是没有空格的,已经被替换掉了。如果需要在代码中添加一个空格,就是在赋值时添加一个空格,需要用两个参数做。分两个参数,分别取天和小时,中间用一个空格格开,代码里面加一个空格,看它的替换情况,同样选择10月1号,加入空格,重新保存提交,再测试。
5.变量中间是带了一个空格,参数替换也正常。看下一个场景,跨天参数替换的情况,需要处理零点运行实例,替换为当天23点,但实际上是要取前一天的23点。取当天,小时候往前取一个小时,保存提交。
6.同样选择业务时间10月1号。
7.现在看它的定时时间是在1:00,年月日、参数替换没有问题,定时时间10月2号,任务的小时是零点,任务定时时间是一点,往前取一个小时是零点,没有问题,如果任务的定时时间是00:00,再看取值会有什么问题。
8。同样选择10月1号,预期要选择前一天23点,现在参数替换仍然是10月2号,小时已经替换为23点,那这样是有问题的,因为要取的是10月1号替换为10月1号才对。所以要往前减一个小时,再看它的替换情况。
9.现在预期应该是0点时,参数取的是前一天,也就是10月1号,小时取的是23点。同样选择业务时间10月1号。参数替换已经正常,也就是选择业务时间10月1号时,多了中括号取值天,应该是取的是11月2号,那如果11月2号凌晨第一个实例要前一天23点那个小时的分区,那需要在天维度的取值这里往前取一个小时,才能够正常的取到,那天往前取了一个小时,定时时间是一点两点,天往前取一个小时也是不会受到影响的,所以跨天调度参数的问题也解决了。
10.看运行和高级运行的区别,新建一个节点,定义变量 select '$(var)';,在右侧给它赋值。选择运行,第一次运行时它会弹框让给代码中的var变量赋值,赋值为1,选择运行。运行没有问题。参数也被替换成1.
11.修改变量名,再保存,再运行,查看参数能否被替换,可以看到参数不会被替换。
12.var1没有被替换掉,因为点运行时,系统内部传参数时传的是var等于1,也就是第一次给它赋值的情况。如果修改了代码中的变量,那一定要再使用高级运行,给var1新变量重新赋值,这时代码中新变量才能被正确的替换掉。第一次点击运行时,它让选择任务需要运行在哪个资源组上,这个逻辑也是适用于资源组的,如果需要修改任务执行资源组,同样要使用高级运行,重新给重新选择资源组,选给代码中的变量重新赋值。