分区表达式介绍
Dataphin数据质量分区表达式,用于控制质量规则按照数据产出日期匹配触发,系统内置了常用的分区表达式,也允许通过自定义方式进行个性化控制。本文为您介绍分区表达式格式说明、分区表达式计算逻辑、内置分区表达式类型以及常用业务示例说明。
使用建议
对于不需要明确指定校验分区,而是代码更新哪些分区就校验哪些分区的场景,建议使用代码检查触发调度-任务更新的分区。这种情况不需要配置校验分区表达式,会自动从代码中检测更新了哪些数据分区。
注意,任务更新分区模式暂不支持触发需要指定分区的波动性校验规则(如分区大小、分区行数、字段统计值)。
对于不需要限制触发日期,希望每天或者表有新分区的时候,就对指定分区进行校验,这时,建议直接使用业务日期
ds='${yyyyMMdd}'
、执行日期ds='$[yyyyMMdd]'
、每月ds='${yyyyMM}'
的分区 。对于希望指定时间才校验的,如每月1号、月末日、工作日才校验,则可以开启条件调度。可以根据公共日历的条件(月份、星期、日期、工作日假日、标签等)和任务的类型(定时调度、手动调度)判断是否进行质量校验。
分区表达式格式说明
分区表达式格式定义:
column1=${FORMAT[OPERATE NUM DELTA]} and columnN=$[FORMAT[OPERATE NUM DELTA]];
示例:
ds=${yyyyMMdd-1M} and city='cn-hangzhou' and hour=${HH:mm:ss};
格式说明:
${表达式}:
计算时将按照数据产出的业务日期为基准进行计算,例如:产出20220101的数据,将按照20220101执行计算。
对于不同格式分区表达式,需要使用${yyyy}、${MM}、${dd}等基础表达式进行拼接,例如:ds=${yyyy}-${MM}-${dd}表达式产出20220101的数据将会生成ds=2022-01-01的分区条件,且各基础表达式可通过OPERATE进行相关操作。
$[表达式]:
计算时将当前执行日期作为基准进行计算,适用于表达当天,可用表达于小时分钟级准实时任务的分区,例如:20220101这一天执行,将把20220101代入计算。
对于不同格式分区表达式,需要使用$[yyyy]、$[MM]、$[dd]等基础表达式进行拼接,例如:ds=$[yyyy]-$[MM]-$[dd]表达式产出20220101的数据将会生成ds=2022-01-01的分区条件,且各基础表达式可通过OPERATE进行相关操作。
column1..columnN:
分区字段,多级分区可以通过and进行连接,形成and类型的多级分区表达式。暂不支持or类型的多级分区表达式。
FORMAT :分区格式化串,支持如下格式化串:
yyyy:年。
MM:月。
dd:日。
ld:每月最后一天。
HH:24制小时。
hh:12制小时。
mm:分钟。
ss:秒。
OPERATE 操作符,支持如下操作符:
+:增加,例如+1y就是加1年,+1M就是加一月。
-:减少,例如-1y就是减1年,-1M就是减一月。
~:指定,例如~3M,就是指定为3月,~1q就是指定为一季度最后一月。
%:取余,例如%1m,就是将月份归零,%1h,就是将小时部分归零。
NUM 数字,用于控制DETA的数量。
DETA 标识符,支持如下表格中的标识符:
标识
含义
类型
实例
y
year
Number
2009
M
month in year
Text & Number
July & 07
d
day in month
Number
10
h
hour in am/pm (1-12)
Number
12
H
hour in day (0-23)
Number
0
m
minute in hour
Number
30
s
second in minute
Number
55
S
millisecond
Number
978
E
day in week
Text
1(周日)
2(周一)
3(周二)
4(周三)
5(周四)
6(周五)
7(周六)
D
day in year
Number
189
F
day of week in month
Number
2 (2nd Wed in July)
w
week in year
Number
27
W
week in month
Number
2
a
am/pm marker
Text
PM
k
hour in day (1-24)
Number
24
K
hour in am/pm (0-11)
Number
0
z
time zone
Text
Pacific Standard Time
Q
季度,取首月
Number
月份=1,4,7,10
q
季度,取末月
Number
月份=3,6,9,12
分区表达式计算逻辑
计算实例1:日期表达式、执行条件与触发条件说明
ds=${yyyyMMld-1d};
日期表达式说明,当5月份的分区数据产出的时候,将进行如下计算:
第一步:计算yyyyMMld,即是取给定日期所在月的最后一天,5月最后一天为31日,得到结果:20220531。
第二步:计算DELTA,DELTA为减1天,20220531减1天为20220530。
最终结果为20220530。
计算实例2:
ds=$[yyyyMMdd-1M];
当使用$[]时,计算依据将是执行日期,而不是数据的业务日期。假设今天是2022年5月3日,现在补了4月3日的数据,将进行如下计算:
第一步,计算yyyyMMdd,按照当前执行时间5月3日,计算得到20220503。
第二步,计算DELTA,DELTA为-1M,将计算上月同一天的数据,计算得到20220403。
最终结果为20220403。
当补4月3日数据时就会触发规则执行,如果补5月3日,或者3月3日,则不会触发规则,$[]主要用于实现与执行日期相关的分区表达。
内置分区表达式类型
业务日期(时间):按照数据产出的业务日期为基准进行计算,例如:产出20220101的数据,将按照20220101执行计算。
执行日期(时间):触发调度取任务定时调度的执行时间(实际执行时间可能会因为上游依赖或者资源问题延后,这里取任务本身的定时时间);定时调度取定时的时间T。
分区表达式 | 新名称 |
ds=${yyyyMMdd} | 业务日期 |
ds=${yyyyMMdd} and hour=${HH} | 业务日期时间 |
ds=${HHmmss} | 业务时间 |
ds=$[yyyyMMdd] | 执行日期 |
ds=$[yyyyMMdd] and hour $[HH] | 执行日期时间 |
ds=$[HHmmss] | 执行时间 |
ds=$[yyyyMMdd - 1d] | 执行日期前一天 |
full table | 全表扫描 |
常用业务示例说明
每月某天产出上个月工资
例如:每个月15日发工资,产出上个月的汇总数据,汇总数据的分区字段为yyyyMM
格式,这时需要如下配置:
调度条件配置:日期-属于-15号。
分区表达式配置。
ds=$[yyyyMM-1M];
每月最后一天日产出本月工资
每个月最后一天发工资,产出上个月的汇总数据,汇总数据的分区字段为yyyyMM
格式,这时需要如下配置:
调度条件配置:日期-属于-月末日。
分区表达式配置。
ds=$[yyyyMM];
分钟级任务每小时最后一分钟检查
通常分钟级任务的ds格式为:yyyyMMdd HH:mm
,每小时最后一分钟就是59分钟,可以通过如下分区表达式:ds=$[yyyyMMdd HH:59];