-
Notifications
You must be signed in to change notification settings - Fork 18
parameter desc
在开发任务的过程中,我们需要有一些系统变量作为参数传给程序,比如,对于一个日常的 ETL 程序,需要每天进行调度,每天分析的数据是前一天的,而数据都是按照时间进行分区,类似的程序可能是这样的:
SELECT product_id, avg(price) FROM tb_order WHERE dt='20170307' GROUP BY product_id;
对于上面的 ETL,我在 20170308 号去运行它是没有问题的,但是,后面每天调度之前都需要修改时间,这显然是不可取的,合理的做法是改为这样:
SELECT product_id, avg(price) FROM tb_order WHERE dt='${date-variant}' GROUP BY product_id;
实际调度的时候,这个 date-variant 会根据调度的日期来进行替换,是一个动态的值。
下面我们会对相关的参数进行介绍。
这里先定义几个变量:
-
${sf.system.bizdate}: 日常调度实例定时的时间日期的前一天,格式为yyyyMMdd,这个变量的翻译分为三种:
- 直接运行:直接运行的时候,这个变量指的是运行日期的前一天。
- 定时调度:对于定时任务,比如每天 2:00 运行,或每小时运行一次等,那么如果是
2016.08.18调度它的,该变量则会解释为20160817。 - 补数据:还有一种场景是补数据,我们可能补
2016.08.18号的数据,那这个变量的值是20160818,而非20160817。
-
${sf.system.bizcurdate}: 日常调度实例定时的定时时间日期,格式为yyyyMMdd,取值为${sf.system.bizdate} + 1。 -
${sf.system.execId}: 执行的 id,每个工作流执行的时候,有一个唯一的执行 id,大部分情况下,用户不需要关注该参数。 -
${sf.system.jobId}: 运行的 job id,每个结点执行的时候,有一个唯一的 job id,大部分情况下,用户不需要关注该参数,该参数仅用于获取结点的日志文件。
现在我们以一个实例来说明下如何对这两个变量进行翻译:
INSERT INTO TABLE stat FROM (SELECT appkey, count(0) FROM tb1 GROUP BY appkey WHERE ds ='${sf.system.bizdate}');
SELECT * FROM tb1 WHERE ds ='${sf.system.bizcurdate}';
上面 SQL 语句执行的时间是 2017-03-08 10:51:36。
- 如果我们直接运行上面的语句,那么
${sf.system.bizdate}替换为20170307,${sf.system.bizcurdate}替换为20170308。 - 如果是调度,比如我们工作流设置为小时调度,每天
00:00-23:59时间段里每隔 1 小时执行一次,那么在2017-03-08当天,工作流调度生成 24 个实例:
- 第一个实例定时时间为
2017-03-08 00:00:00,则:${sf.system.bizdate}替换的结果为20170307,${sf.system.bizcurdate}替换的结果为20170308。 - 第二个实例定时时间为
2017-03-08 01:00:00,则:${sf.system.bizdate}替换的结果为20170307,${sf.system.bizcurdate}替换的结果为20170308。
依次类推,它们的时间都是一样的。
如果是补数据,我们实际上会设置补哪天的数据,比如我要补的是 2017-02-12 ~ 2017-02-20 的数据,然后补数据频率是每天 15:00 运行,那么我们解析如下:
- 第一个实例定时时间为
2017-02-12 15:00:00,则:${sf.system.bizdate}替换的结果为20170212,${sf.system.bizcurdate}替换的结果为20170213。 - 第二个实例定时时间为
2017-02-13 15:00:00,则:${sf.system.bizdate}替换的结果为20170213,${sf.system.bizcurdate}替换的结果为20170214。 - 第三个实例补数据为
2017-02-14 15:00:00,则:${sf.system.bizdate}替换的结果为20170214,${sf.system.bizcurdate}替换的结果为20170215。
上面的时间也许能满足大部分需求了,但是相对比较粗,只能精确到日期,所以我们又定义了:${sf.system.cyctime},格式 yyyyMMddHHmmss,表示的是日常调度实例定时时间(年月日时分秒)。
其中,yyyy 表示 4 位数年份,MM 表示 2 位数月份,dd 表示 2 位数天,HH 表示 24 小时制的时,mm 表示 2 位数分钟,ss 表示 2 位数秒。
我们还是以一个实例来说明如何对其进行解释。
SELECT * FROM tb1 WHERE ds ='${sf.system.cyctime}';
上面 SQL 语句执行的时间是 2017-03-08 10:51:36。
如果我们直接运行上面的语句,那么 ${sf.system.cyctime} 替换为 20170308105136。
如果是调度,比如我们工作流设置为小时调度,每天 00:00-23:59 时间段里每隔 1 小时执行一次,那么 2017-03-08 当天,工作流调度生成 24 个实例:
- 第一个实例定时时间为
2017-03-08 00:00:00,则:${sf.system.cyctime}替换的结果为20170308000000。 - 第二个实例定时时间为
2017-03-08 01:00:00,则:${sf.system.cyctime}替换的结果为20170308010000。
如果是补数据,我们实际上会设置补数据的时间,比如我要补的是 2017-02-12 ~ 2017-02-20 数据,是每天 15:00 运行,那么我们解析如下:
- 第一个实例定时时间为
2017-02-12 15:00:00,则:${sf.system.cyctime}替换的结果为20170213150000。 - 第二个实例定时时间为
2017-02-13 15:00:00,则:${sf.system.cyctime}替换的结果为20170214150000。 - 第三个实例定时时间为
2017-02-14 15:00:00,则:${sf.system.cyctime}替换的结果为20170215150000。
依次类推。
- 系统参数总结
| 变量名称 | 含义 | 示例 |
|---|---|---|
${sf.system.bizdate} |
日常调度实例定时的定时时间前一天,格式为 yyyyMMdd,补数据时,该日期 +1 |
|
${sf.system.bizcurdate} |
日常调度实例定时的定时时间,格式为 yyyyMMdd,补数据时,该日期 +1 |
|
${sf.system.cyctime} |
日常调度实例定时的定时时间,格式为 yyyyMMddHHmmss,补数据时,该日期 +1 |
支持代码中自定义变量名,声明方式:${变量名}。那么变量的值怎么设置呢?可以是引用 "系统参数" 或指定 "常量", 当然也可以混合使用。
如,我们可以配置: ${tableName} 为 table1。
自定义参数的一个强大之处还在于,可以基于系统参数 ${dw.system.cyctime} 来定义,这里实际上定义了一个基准参数。
其实基准参数:
${dw.system.cyctime}=$[yyyyMMddHHmmss]
注意,我们定义这种基准变量为 $[yyyyMMdd], $[HHmmss], $[yyyy-MM-dd], $[HH:mm:ss] 等。
注意 $[...] 中的 ... 不允许出现空格。
另外,我们定义获取 "+/-周期" 的方法:
注意:下面的
yyyyMMdd,HHmmss都可以随意扩展,比如可以替换为yyyyMMddHHmmss,yyyy-MM-dd/HHmmss等等。
- 后 N 年:
$[add_months(yyyyMMdd,12*N)] - 前 N 年:
$[add_months(yyyyMMdd,-12*N)] - 后 N 月:
$[add_months(yyyyMMdd,N)] - 前 N 月:
$[add_months(yyyyMMdd,-N)] - 后 N 周:
$[yyyyMMdd+7*N] - 前 N 周:
$[yyyyMMdd-7*N] - 后 N 天:
$[yyyyMMdd+N] - 前 N 天:
$[yyyyMMdd-N] - 后 N 小时:
$[HHmmss+N/24] - 前 N 小时:
$[HHmmss-N/24] - 后 N 分钟:
$[HHmmss+N/24/60] - 前 N 分钟:
$[HHmmss-N/24/60]
另外,我们定义了如下的一些规则:
-
$[month_begin(yyyyMMdd,N)]:月初,N 为 0 表示月初,为其它正数,表示相对于月初的偏移,比如$[month_begin(yyyyMMdd,1)]表示当月 2 号。 -
$[month_end(yyyyMMdd,-N)]:月末,N 为 0 表示月末,为其它正数,表示相对于月末的偏移,比如$[month_begin(yyyyMMdd, -1)]表示当月最后一天往前推一天。 -
$[week_begin(yyyyMMdd,N)]:表示的是周的逻辑,推理逻辑同上。 -
$[week_end(yyyyMMdd,-N)]:表示的是周的逻辑,推理逻辑同上。 -
$[timestamp(...)]:其中...表示的是格式 yyyyMMddHHmmss,比如$[timestamp(yyyyMMddHHmmss-N/24/60)]、$[timestamp(week_begin(yyyyMMddHHmmss,N))]等,注意参数如yyyyMMddHHmmss-N/24/60不能写成$[yyyyMMddHHmmss-N/24/60],这里会自动的解析,也就是说,不支持$[...] 里面嵌套 $ [] 的形式。
例如,自定义参数配置如下:
thishour=$[yyyy-MM-dd/HH:mm:ss]
lasthour=$[yyyy-MM-dd/HH:mm:ss-1/24]
2017.03.08 当天,工作流生成 24 个实例:
- 第一个实例定时时间为
2017-03-08 00:00:00,那么thishour替换的结果为2017-03-08/00:00:00,lasthour替换的结果为2017-03-07/23:00:00。 - 第二个实例定时时间为
2017-03-08 01:00:00,那么thishour替换的结果为2017-03-08/01:00:00,lasthour替换的结果为2017-03-08/00:00:00。 - 以此类推第 24 个实例定时时间为
2017-03-08 23:00:00,那么thishour替换的结果为2017-03-08/23:00:00,lasthour替换的结果为2017-03-08/22:00:00。
| 参数 | 类型 | 是否必选 | 描述 | 说明 |
|---|---|---|---|---|
| prop | string | 是 | 参数 key | |
| value | string | 是 | 参数 value |
示例:
{
"prop": "year",
"value": "$[yyyy]"
}