本篇文章主要介绍了DataWorks调度参数的两种分类——系统内置变量和自定义参数,并介绍了各参数的使用和测试方式、注意事项和常见场景,实操演示了参数在各场景下的使用情况。
分享人:DataWorks技术支持团队
我们在开发者社区学习路线里有发布一个DataWorks的学习路线,里面包含了入门讲解和熟能生巧系列的直播内容,大家可以去学习一下,需要主账号登陆学习哦:https://developer.aliyun.com/learning/course/81
一、调度参数的分类和使用
1、分类
调度参数分为系统内置变量和自定义参数两类,其区别在于能否在代码中直接使用。系统内置变量可以直接使用,不需要赋值。自定义参数需要在代码中自定义一个变量,然后在参数配置区给这个变量赋值,赋值支持四种形式的值:${…}、$[…]、系统内置参数(例如$bizdate)、常量。
2、系统参数
首先是系统参数配置,取值和格式如下,包括业务时间和定时时间,业务时间等于定时时间减一天,也就是业务时间在定时时间前一天。另外,业务时间精确到天,取值与自定义参数${yyyymmdd}一致,定时时间精确到时分秒取值与$[yyyymmddhh24miss]一致。
3、自定义参数
然后是自定义参数。先看大括号格式 ${…},大括号格式可以精确到天。并且如果只需取到月份的话,需要用大括号形式。
中括号格式如下图,是可以精确到时、分、秒的。
然后是系统内置参数,用得比较多的是后面四个,$bizdate可以取到天,$cyctime可以取到时分秒,$gmtdate也精确到天,最后$bizmonth取到月份。
4、使用示例
如下图,这里在代码中可以直接使用${bdp.system.cyctime}和${bdp.system.bizdate},不用在右侧调度配置参数栏中赋值,而自定义参数需要在代码中自定义一个变量名,写作${var1}形式表示变量var1,右侧参数配置中需要用var1=$bizdate(系统变量形式)或者var1=${yyyymmdd} (自定义参数形式)来给var1变量赋值。另外,只有${bdp.system.cyctime}和${bdp.system.bizdate}这两个系统内置变量可以直接在代码中使用,代码中是不能直接使用系统内置参数的(比如$bizdate),如果想要代码中使用${bizdate},仍然需要在右侧参数配置处赋值bizdate=$bizdate(和var1是一样的)。
ODPS SQL节点使用示例如下图。两个系统变量可以在代码中直接使用,而自定义参数需要先在代码中定义变量名,然后在右侧参数配置里给变量赋值。。
数据集成节点使用示例如下,与ODPS SQL节点一致,注意如果在分区信息中配置pt=${bizdata},那需要在右侧参数配置中配置bizdata=$bizdate:
Shell节点使用示例也一样,但Shell节点中的变量不允许自定义命名,只能以$1、$2、$3…来命名,当参数达到10个后,需要用大括号,如${10}。
PyODPS节点也一样,但在使用自定义参数的时候,为了避免侵入代码,可以在全局变量中增加一个args的字典对象,调度参数可以在此获取。
5、调度参数的注意事项
DataWorks有三种运行方式,运行、高级运行和开发环境冒烟测试,这里有几个需要注意的地方。
选择运行,只会在第一次弹框时给当前的变量赋值常量。如果修改了代码中变量名是不会继续弹框给新变量赋值。选择高级运行,每次都会弹框给当前变量赋值。如果您变更了代码中的变量,或者需要重新为变量赋值,请务必使用高级运行。运行和高级运行都只能给参数赋值常量,用于测试。如果您需要测试实际调度时的参数替换,请使用开发环境冒烟测试。
开发环境冒烟测试会根据业务时间替换调度参数;若修改了调度参数赋值,请务必先保存提交,再使用开发环境冒烟测试。
需要注意的是参数赋值语句中,空格仅用于分离多条赋值语句,即多个自定义变量赋值语句可以用空格分离(下图4处),但单个赋值语句内不支持 使用空格(下图1、2、3处)。另外,大括号可以取任务的业务时间,最小粒度是天,中括号取定时时间,可以精确到时分秒。
6、使用调度参数的常见场景
场景一:如何处理表的分区格式中需要空格的情况。如果要在时间中带一个空格,需要用两个参数来做,一个参数取年月日,一个参数取时分秒,然后在代码里用一个空格去拼接两个参数,这样就可以实现替换的值中带一个空格。
场景二:跨天调度参数替换。
如何处理小时任务0点运行的实例,计算结果变为当天的23点,实际应当是前一天的23点的情况?
问题描述:
在代码中表的分区为pt=${datetime} ${hour},希望执行时获取上个小时的数据。使用两个自定义变量参数datetime=$[yyyymmdd]、hour=$[hh24-1/24]可以满足需求。但是0点运行的实例,计算结果会变成当天的23点,实际应当是前一天的23点。
解决方法:
您可以修改参数的计算公式,修改datetime为$[yyyymmdd-1/24],hour的计算公式仍然是$[hh24-1/24]。计算结果如下,即可满足需求:
如果一个实例的定时时间是2015-10-27 00:00:00,减1小时便是昨天,则$[yyyymmdd-1/24]的值是20151026、$[hh24-1/24]的值是23。
如果一个实例的定时时间为2015-10-27 01:00:00的实例,减1小时还是今天,则$[yyyymmdd-1/24]的值是20151027、$[hh24-1/24]的值是0。
二、实操演练
1、内置参数
先针对两个参数来看它的替换情况,bizdate是业务时间,cyctime是定时时间,也就是具体时间。我们选择开发环境冒烟测试来看这两个参数的替换情况。每次修改完务必先保存、提交,再点击开发环境冒烟测试。
我们选择业务时间假设是10月1号,那bdp.system.bizdate的取值应该是2020年10月1号,那bdp.system.cyctime的取值应该是2020年10月2号,它的小时分钟应该全是0。接着我们看一下它实际运行的结果,如下图,冒烟测试后日志中可以看到替换的值,业务时间20201001没有问题。
然后cyctime的参数值为20201002000000。替换出来也是对的
2、自定义参数大括号格式
接下来看一下自定义参数大括号的这种格式。当前取了5个参数,bizdate、年月日、年份、月份和天,业务日期还是选择2020年10月1号。
如下图,冒烟测试后日志中可以看到bizdate等于20201001,var1取年月日,值和bizdate一致,var2取了年份,var3取月份,var4取日期,取值都没有问题。
接下来尝试往前取一年,往前取一个月和往前取一天。如果要往前取多少年多少月,那一定要使用大括号的这种格式。可以看到参数赋值这里都减了1
如下图,冒烟测试后日志中可以看到,bizdate依旧是20201001,但是现在年份往前取了一年变成2019,月份和天也提前了,成了9月31日,取值也没问题。
3、自定义参数中括号格式
然后看下中括号的这种格式,参数有cyctime、年月日、时分秒、小时和分钟。因为中括号形式能取到时分秒,所以用cyctime来做示例,这里cyctime也是个变量,和bizdate一样,需要赋值。这里定时时间我们选0点29分。
保存、提交、开发环境冒烟测试完成后打开日志来查看下,cyctime是20201002002900,也就是2020年10月2日0点29分00秒,是没问题的。另外var2的年月日、var3的时分秒、var4的小时和var5的分钟替换值也都没问题。
然后单独测试下往前取一个小时。现在的任务定时时间是0:29,业务时间是10月1号,那么往前取一个小时应该是23点。再次提醒,修改代码变量的时候一定要先保存提交,然后再去使用开发环境冒烟测试。
替换出来后var4的值是23,小时是23点,没问题。
4、业务场景——赋值中带空格
我们现在把空格加上,参数赋值var=[yyyymmdd hh24miss],尝试将年月日和时分秒用空格分开,看看是什么情况。
测试日志中可以看到,虽然在变量赋值语句中加了一个空格,但是替换出来的值是没有空格的。
如果要在赋值的时候添加一个空格,就需要用两个参数来做。这个场景先分成两个参数,分别取年月日和时分秒,中间用一个空格隔开,然后代码里面也要加一个空格。
可以看到代码语句select '${var1}' '${var2}'这里的变量var1和var2中间是带了一个空格的,参数替换也正常,分别是年月日20201002和时分秒000400。
5、业务场景——跨天调度参数替换
处理0点的运行实例,要取前一天的23点,但它却会替换为当天的23点。比如这里选择业务时间为10月1号,定时时间为0点,那么实际正常结果定时时间出来应该是10月2号0点,然后再往前减1个小时,就应该是10月1号23点。
但是测试结果日志里可以看到这里替换成了10月2号23点,这个结果是错的。
这个时候我们可以修改成datetime=[yyyymmdd-1/24],即日期也往前减一个小时。
这时结果是20201001 和 23,即10月1号23点,是正确的取值了。
6、运行与高级运行区别
首先是“运行”功能,新建一个SQL节点,代码中写上select ‘${var}’。
然后点击运行,第一次运行的时候会有弹窗,可以为代码中的var赋值,这里赋值为1,点确定后点击运行。
这里运行没有问题,参数var也替换为了1。
现在把变量名修改一下,改为var1,然后再保存、运行。
此时因为不是第一次运行,不会再弹框为变量赋值,会直接弹出运行框。
可以看到运行日志中var1参数没有替换。
所以如果修改了代码中的变量,就一定要使用高级运行给var1这个新变量重新赋值。
这样代码中的新变量var1才能被正确地替换掉。
另外,如果需要修改调度资源组,也是需要使用高级运行重新选择资源组,和参数赋值是同一个界面。
以上就是本次分享的全部内容了,有问题需要解答的同学可以扫码加一下我们的钉钉大群,群里有直播回放可以观看。
感谢大家的关注!