利用DataWorks赋值节点补强参数功能

一、前言

DataWorks提供了系统参数供周期调度的任务使用,一般最常用到的系统参数是这两个:
${bdp.system.bizdate}${bdp.system.cyctime},分别代表任务运行时的昨天和当前时间。

系统参数 简写模式 格式 示例
${bdp.system.bizdate} ${bizdate} yyyymmdd 20190802
${bdp.system.cyctime} ${cyctime} yyyymmddhh24miss 20190802110653

使用简写模式时,参数配置里需要写上例如bizdate=$bizdate的配置内容,如果写上了完整的系统参数则无需配置

这种系统参数的好处是直接调用,在任务执行时直接会被替换为对用的内容。
当然DataWorks也提供了自定义参数,可以方便地生成定制化的时间格式。
对应的也有两类:

  • 大括号{ }:对应业务时间,例如{yyyymmdd}将基于bdp.system.bizdate取值。
  • 中括号[ ]:对应运行时间,例如[yyyymmddhh]将基于bdp.system.cyctime取值。

自定义参数可以通过在括号内+/-N来获取后N天,前N天的时间,基于时间格式的不同也可以达到后N月,前N月,后N年,前N年等等诸如此类的操作,这里不展开。
除此之外还有一些不太常用的系统参数:

参数 说明
$jobid 任务所属的工作流ID
$nodeid 节点id
$taskid 任务ID(节点实例ID)
$bizmonth 业务月份(格式为yyyymm),其实就是运行时间的上一月
$gmtdate 当前日期(格式为yyyymmdd),此参数默认为当天日期,补数据时传入的是业务日期+1,相当于$cyctime的日期版

二、那么问题来了

上面对DataWorks的参数做了简单介绍,那么如果我们想获得更加定制化的参数怎么办。比如在一个数据同步任务里需要Unix时间戳。这种场景并不是我空想出来的,在有些业务数据库中并没有存储datetime类型的时间字段,这种时候想增量同步数据到ODPS不管是系统参数还是自定义参数都无法实现。

解决方案

2.1 加字段

有一种简单粗暴的办法就是让开发在业务数据库表中加上datetime字段,这样就能利用上DataWorks提供的系统参数或者自定义参数来解决。

2.2 脚本处理

不将任务配置在DataWorks上,而是通过MaxCompute Studio或者ODPSCMD工具与MaxCompute交互,在脚本里将解析Unix时间戳取出数据后再上传。

2.3 赋值节点

终于来到本文重点,上述两种办法的确能解决问题,但会额外增加多余的开销。加字段增加了开发成本,而且对业务没有帮助,开发不见得乐意帮你做。通过脚本处理会导致任务节点的依赖关系不好关联,在DataWorks管辖范围之外又多了一批脚本需要管理,互相之间的依赖几乎无解。
所幸DataWorks提供了赋值节点功能,如何创建赋值节点不再赘述,在数据开发里很容易找到。直接实战上代码:
通过SHELL赋值

yesterday_d=`date -d "-1 day" "+%Y-%m-%d 00:00:00"` #取昨天时间
timeStamp_yd=`date -d "$yesterday_d" +%s`   #取昨天的10时间戳
today_d=`date "+%Y-%m-%d 00:00:00"`
timeStamp_td=`date -d "$today_d" +%s`
echo $timeStamp_yd"000",$timeStamp_td"000"     #改成13位时间戳

通过SQL赋值

SELECT  UNIX_TIMESTAMP(TO_DATE('${bdp.system.bizdate}','yyyymmdd'))*1000
,UNIX_TIMESTAMP(DATEADD(TO_DATE('${bdp.system.bizdate}','yyyymmdd'),1,'dd' ))*1000;

可以看到赋值节点是取到了代码中的最后一条echo、select、print里的结果。不过下游节点在调用时会有些不一样。

  • SHELL赋值传给下游节点的是一个一维数组,需要这样调用:${input[0]}${input[1]};
  • SQL赋值传给下游节点的参数是一个二维数组,需要这样调用:${input[0][0]}${input[0][1]};
  • Python赋值传给下游节点的同SHELL,也是一维数组,调用方式相同。

既然是数组,显然并不是一定要调用到元素那一层,直接${input}也是支持的,两个参数会用逗号隔开组成一个完整字符串被调用。

三、后话

这是仅作抛砖引玉,用时间戳的例子来展示如何使用赋值节点在为任务传参。显然你可以利用SHELL、ODPS SQL、Python创造出你想要的任意参数,然后通过做好上下游任务依赖,配置上下文参数传递的方式传给下游节点。如何传递这里就不再演示了,可自行查阅官方文档。

你可能感兴趣的:(大数据)