分区表达式介绍

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月份的分区数据产出的时候,将进行如下计算:

  1. 第一步:计算yyyyMMld,即是取给定日期所在月的最后一天,5月最后一天为31日,得到结果:20220531。

  2. 第二步:计算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号。

    image.png

  • 分区表达式配置。

ds=$[yyyyMM-1M];

每月最后一天日产出本月工资

每个月最后一天发工资,产出上个月的汇总数据,汇总数据的分区字段为yyyyMM格式,这时需要如下配置:

  • 调度条件配置:日期-属于-月末日。

    image.png

  • 分区表达式配置。

ds=$[yyyyMM];

分钟级任务每小时最后一分钟检查

通常分钟级任务的ds格式为:yyyyMMdd HH:mm,每小时最后一分钟就是59分钟,可以通过如下分区表达式:ds=$[yyyyMMdd HH:59];