如何用 Apache DolphinScheduler 实现自动配置自定义变量?

file 作者 | sqlboy-yuzhenc

背景介绍

在实际工作应用中,我们可能需要在整个 Apache DolphinScheduler 层面定义共用的日期变量,但是,开源版 Apache DolphinScheduler 只允许配置工作流级别的全局变量,这样,每个工作流就得配置相同的变量,操作起来重复并且麻烦。通过这篇文章,只需要将海豚调度级别的变量插入到变量表中,就会在保存工作流的时候将变量表中的变量自动配置。

原理

在工作流定义表(t_ds_process_definition)上定义一个事前触发器,在更新或插入数据之前,触发器会将t_ds_process_definition.global_params 的值替换为用户在工作流保存界面上配置的全局变量与在变量定义表中定义的变量的并集。

tool模式操作

创建自定义枚举类型

create type vartype as enum ('INTEGER','VARCHAR','LONG','FLOAT','DOUBLE','DATE','TIME','TIMESTAMP','BOOLEAN','LIST');
create type vardirect as enum ('IN','OUT');

创建变量定义表

drop table if exists prop_def cascade;
create table prop_def (
     prop varchar(63) primary key  --参数名 
    ,prop_def text  --参数定义
    ,prop_def_dp text  --对应的海豚的定义
    ,prop_desc text  --参数描述
    ,prop_direct vardirect default 'IN'  --参数类型  IN或out
    ,prop_type vartype default 'VARCHAR'  --参数类型 VARCHAR INTEGER LONG FLOAT DOUBLE DATE TIME TIMESTAMP BOOLEAN LIST
    ,prop_create_time timestamp default current_timestamp  --变量创建时间
);
comment on table prop_def is '参数定义表';
comment on column prop_def.prop is '参数名';
comment on column prop_def.prop_def is '参数定义';
comment on column prop_def.prop_def_dp is '对应的海豚的参数定义';
comment on column prop_def.prop_direct is '参数类型  IN或out';
comment on column prop_def.prop_type is '参数类型 VARCHAR INTEGER LONG FLOAT DOUBLE DATE TIME TIMESTAMP BOOLEAN LIST';
comment on column prop_def.prop_desc is '参数描述';
comment on column prop_def.prop_create_time is '参数创建时间';

插入变量定义

insert into prop_def(
     prop  --参数名
    ,prop_def  --参数定义
    ,prop_def_dp  --对应的海豚的定义
    ,prop_desc  --参数描述
) values 
 ('today',$$to_char(current_date,'yyyymmdd')$$,$$$[yyyyMMdd]$$,'今天')
,('yesterday',$$to_char(current_date-1,'yyyymmdd')$$,$$$[yyyyMMdd-1]$$,'昨天')
,('tomorrow',$$to_char(current_date+1,'yyyymmdd')$$,$$$[yyyyMMdd+1]$$,'明天')
,('thismonth',$$to_char(current_date,'yyyymm')$$,$$$[yyyyMM]$$,'本月')
,('lastmonth',$$to_char(to_date(to_char(current_date,'yyyymm')||'01','yyyymmdd')-1,'yyyymm')$$,$$$[add_months(yyyyMM,-1)]$$,'上月')
,('nextmonth',$$(to_char(current_date,'yyyymm')::numeric+1)::varchar$$,$$$[add_months(yyyyMM,1)]$$,'下月')
,('thisyear',$$to_char(current_date,'yyyy')$$,$$$[yyyy]$$,'本年')
,('nextyear',$$(to_char(current_date,'yyyy')::int+1)::varchar$$,$$$[add_months(yyyy, 12*1)]$$,'明年')
,('lastyear',$$(to_char(current_date,'yyyy')::int-1)::varchar$$,$$$[add_months(yyyy, -12*1)]$$,'去年')
;

创建获取变量值函数

create or replace function get_propdef(propdef_sql varchar) 
 returns varchar
 language plpgsql
as $function$ 
/*
 * 作者:v-yuzhenc
 * 功能:返回指定变量定义具体实时的值
 * propdef_sql:变量定义sql
 * */
declare 
    p_result varchar;
    p_propdef_sql varchar;
begin
    execute 'select '||propdef_sql into p_result;
       return p_result;
    exception when others then 
        return p_result;
end;
$function$
;
grant execute on function get_propdef(varchar) to public;

创建实时变量值视图

create or replace view v_prop_def as
select 
     current_timestamp as currenttime  --当前时间
    ,prop  --参数名
    ,prop_def  --参数定义
    ,prop_def_dp  --对应的海豚的定义
    ,get_propdef(prop_def) as prop_value  --当前时间的参数值
    ,prop_desc  --参数描述
    ,prop_direct  --参数类型  IN或out
    ,prop_type  --参数类型 VARCHAR INTEGER LONG FLOAT DOUBLE DATE TIME TIMESTAMP BOOLEAN LIST
from prop_def
;
comment on view v_prop_def is '实时变量表';
comment on column v_prop_def.currenttime is '当前时间';
comment on column v_prop_def.prop is '参数名';
comment on column v_prop_def.prop_def is '参数定义';
comment on column v_prop_def.prop_def_dp is '对应的海豚的定义';
comment on column v_prop_def.prop_value is '当前时间的参数值';
comment on column v_prop_def.prop_desc is '参数描述';
comment on column v_prop_def.prop_direct is '参数类型  IN或out';
comment on column v_prop_def.prop_type is '参数类型 VARCHAR INTEGER LONG FLOAT DOUBLE DATE TIME TIMESTAMP BOOLEAN LIST';

dp模式操作

创建触发器函数

create or replace function tg_ds_udef_prop_def()
returns trigger 
as $trigger$
/*
 * 作者:v-yuzhenc
 * 功能:海豚调度自动配置替代变量
 * */
begin
    select (('['||string_agg($${"prop":"$$||prop||$$","value":"$$||value||$$","direct":"$$||direct||$$","type":"$$||type||$$"}$$,',')||']')::json)::text
    into new.global_params
    from (
        select 
             coalesce(a.prop,b.prop) prop
            ,coalesce(a.prop_def_dp,b.value) value
            ,coalesce(a.prop_direct::varchar,b.direct) direct
            ,coalesce(a.prop_type::varchar,b.type) type
        from tool.prop_def a 
        full join (
            select 
                 json_array_elements(new.global_params::json) ->> 'prop' as prop
                ,json_array_elements(new.global_params::json) ->> 'value' as value
                ,json_array_elements(new.global_params::json) ->> 'direct' as direct
                ,json_array_elements(new.global_params::json) ->> 'type' as type
        ) b 
        on (a.prop = b.prop)
    ) a
    ;
    return new;
end;
$trigger$
language plpgsql;
  • 注:这里的tool和dp是pg的模式,我海豚调度的元数据存储在dp模式下,但是变量定义表存储在tool下,所以在函数中访问变量定义表时加了tool.(即tool.prop_def),请根据自己实际情况修改。

    创建触发器

  • 这里创建事前触发器,在更改或者新增一个工作流之前,将变量的定义给到全局参数定义字段
    create trigger tg_prop_ds_process_definition before update or insert on t_ds_process_definition for each row execute procedure tg_ds_udef_prop_def();

测试

查询实时变量值视图

select * from v_prop_def;

file

工作流测试

  • 创建工作流,选择shell插件
    echo ${today}
    echo ${yesterday}
    echo ${tomorrow}
    echo ${thismonth}
    echo ${lastmonth}
    echo ${nextmonth}
    echo ${thisyear}
    echo ${nextyear}
    echo ${lastyear}

file

  • 点击保存

file

  • 上线工作流,点击运行工作流,界面就能看出变量已经自动配置上

file

  • 运行完毕,查看shell任务日志

file

  • 下线工作流,点击编辑工作流,点击保存,可以看到变量是已经自动定义

file

本文转载自优快云博主sqlboy-yuzhenc文章:https://blog.youkuaiyun.com/qq_33445829/article/details/131331848

本文由 白鲸开源科技 提供发布支持!

<think>好的,我现在需要回答用户关于在DolphinScheduler中为FLOW添加时间变量的方法。首先,我需要回忆DolphinScheduler的相关知识,尤其是参数设置和时间变量部分。 用户提到了引用3中的add_months()函数,这可能是关键。时间变量在调度系统中通常用于动态生成日期,比如根据当前时间计算前一个月的日期。DolphinScheduler支持参数传递和时间格式的设置,用户需要了解如何在定义FLOW时使用这些功能。 接下来,我应该分步骤说明如何添加时间变量。首先,用户需要在任务定义中使用特定的语法来引用时间参数。例如,使用${参数名}的格式。然后,结合add_months()函数来调整月份,比如设置业务日期为前一个月,可能需要类似add_months(yyyyMMdd, -1)的表达式。 另外,全局参数和局部参数的区别也需要解释清楚。全局参数适用于整个FLOW,而局部参数只在特定任务中有效。用户需要知道在哪里设置这些参数,可能是在FLOW的配置页面或者任务的高级设置中。 还需要考虑用户可能遇到的问题,例如时间格式是否正确,函数使用是否正确。可能需要提醒用户注意时间格式的输入参数,确保和函数要求的格式一致。例如,add_months的第一个参数是时间格式字符串,如yyyyMMdd,第二个是偏移量。 最后,根据用户提供的引用内容,特别是引用3,需要正确引用该部分说明add_months的用法,确保回答的准确性。同时,可能需要结合DolphinScheduler的官方文档或社区实践,给出示例代码或配置步骤,帮助用户更好地理解和应用。</think>在 DolphinScheduler 中为 FLOW 添加时间变量,可通过**参数化配置结合内置时间函数**实现。以下是具体方法: --- ### 一、使用内置时间函数 DolphinScheduler 提供如 $add_months()$ 等函数处理时间变量,语法为: $$add\_months(\text{时间格式}, \text{月份偏移量})$$ 例如,设置业务日期为前一个月的第一天: ```shell ${system.biz.date} = add_months(yyyyMMdd, -1) ``` 表示将当前日期减去 1 个月,格式为 $yyyyMMdd$[^3]。 --- ### 二、配置时间参数 1. **全局参数**:在 FLOW 定义页面的「全局参数」中添加: ```properties business_date=${system.biz.date} ``` 2. **局部参数**:在具体任务的「自定义参数」中引用: ```properties input_path=/data/${business_date}/input.csv ``` --- ### 三、动态时间格式转换 若需其他时间格式(如 $yyyy-MM-dd$),可通过嵌套函数实现: ```shell ${system.biz.curdate} = yyyy-MM-dd # 当前日期 ${last_month} = add_months(${system.biz.curdate}, -1) # 前一个月 ``` --- ### 四、实践示例 假设需要每天处理上个月的数据: 1. 全局参数设置: ```properties last_month = add_months(yyyyMM, -1) ``` 2. 在 SQL 任务中引用: ```sql SELECT * FROM table WHERE month = '${last_month}'; ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DolphinScheduler社区

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值