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