airflow自定义宏

本文介绍如何在Airflow中使用自定义宏,包括日期和时间的加减操作,展示了具体的代码实现和宏的注册过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 自定义宏使用样例代码

import airflow
from airflow import DAG
from airflow.operators.dummy_operator import DummyOperator
from datetime import datetime,timedelta
from airflow.operators.bash_operator import BashOperator


# --------------------- 1 脚本位置-------------------
# vi /home/hadoop/airflow/dags/ssjt/test/test_macros_dag.py


# --------------------- 2 指定参数 --------------------------
start_date=datetime(2020,9,6,tzinfo=airflow.utils.timezone.utc)
schedule_interval='45 10 * * *'
table_name='test_macros'
owner='ssjt'
alert_to=['ssjt@163.com']
execution_timeout=timedelta(minutes=90)


# --------------------- 3 封装默认参数- -------------------------
default_args = {
    'owner': owner,
    'depends_on_past': False,
    'start_date': start_date,
    'email': alert_to,
    'execution_timeout': execution_timeout
}


#---------------------- 4.0 定义处理日期的函数,用于宏处理 ---------------
def date_add2(ds_nodash ,days):
    """
    自定义 Jinja 方法,对日期进行增减操作
    :param ds_nodash : 日期
    :param days: 增加的天数,负数则为减
    :return: 增加后的日期
    """
    ds_nodash2 = datetime.strptime(ds_nodash ,'%Y%m%d')
    new_date = (ds_nodash2 + timedelta(days=days)).strftime('%Y%m%d')
    return str(new_date)


#---------------------- 5 定义dag,并注册自定义宏 ---------------
main_dag = DAG(
    dag_id=table_name+'_dag',
    default_args=default_args,
    catchup=False,
    schedule_interval=schedule_interval,
    user_defined_macros={
    "date_add2": date_add2,
    }
)


# ------------------- 6 创建开始、结束虚拟任务 --------------
start = DummyOperator(task_id='start', dag=main_dag)
finish = DummyOperator(task_id='finish', dag=main_dag)



#--------------------- 7 定义BashOperator,测试自定义宏 ---------------
task01 = BashOperator(
    task_id='test_user_define_macro',
    bash_command='echo {{ds_nodash }} {{ date_add2(ds_nodash ,0) }} {{ date_add2(ds_nodash ,1) }} {{ date_add2(ds_nodash ,-1) }}',
    dag=main_dag
    )


# ----------------------- 8 指定任务间依赖 ------------------
start >> task01 >> finish

2 日期加减处理函数代码

def date_add2(ds_nodash ,days):
    """
    自定义 Jinja 方法,对日期进行增减操作
    :param ds_nodash : 日期
    :param days: 增加的天数,负数则为减
    :return: 增加后的日期
    """
    ds_nodash2 = datetime.strptime(ds_nodash ,'%Y%m%d')
    new_date = (ds_nodash2 + timedelta(days=days)).strftime('%Y%m%d')
    return str(new_date)

3 小时加减处理函数代码

# 定义宏函数
def hour_add(ts, hours):
    """
    自定义 Jinja 方法,对小时进行增减操作
    :param ts: 日期
    :param hours: 增减的小时数
    :return: 增减后的小时参数
    """
    ts2=datetime.strptime(ts.split('+')[0], '%Y-%m-%dT%H:%M:%S')
    new_date = (ts2 + timedelta(hours=hours)).strftime('%Y%m%d%H')
    return str(new_date)



# 具体调佣方式
task01 = BashOperator(
    task_id='test_user_define_macro',
    bash_command='echo {{ts}}--- {{ hour_add(ts,-1) }}-- dt {{ hour_add(ts ,-1)[0:8] }} --- dh:  {{ hour_add(ts ,-1)[-2:] }}',
    dag=main_dag
    )


# 运行结果
 2021-09-21T18:05:00+08:00 --- 2021092117 -- dt 20210921 --- dh: 17


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值