一、Airflow自定义宏函数
# 不同批次需限定分区
# 根据DAG下一个批次的逻辑执行时间计算出当前批次的东八区时间来确定分区
# ---- 定义小时级任务处理时区的函数,用于宏处理 ----------
import datetime
from datetime import datetime
from datetime import timedelta
def partitions(next_exec_date, hours=7):
"""
自定义 Jinja 方法,根据批次时间获取表对应的分区(天,小时)
:param next_exec_date : 下一个批次的execution_date(@once批次任务不能使用,下一个批次的execution_date为null)
:param hours: 增加的小时,修改为+8时区
:return: 批次对应时区参数(dict(string:string) 非0开头小时)
"""
next_exec_date = str(next_exec_date)[0:19]
# 批次任务对应的东八区时间 减去 1小时
now_date = datetime.strptime(next_exec_date, '%Y-%m-%dT%H:%M:%S') + timedelta(hours=hours)
# 批次任务对应的东八区时间
now_time = datetime.strptime(next_exec_date, '%Y-%m-%dT%H:%M:%S') + timedelta(hours=8)
# 周几
week_n = str(now_time.weekday() + 1)
# 批次任务对应的东八区时间 减去 1小时后的 hour
hour = str(int(now_date.hour))
if len(hour) != 1:
hour_str = hour
else:
hour_str = ('0' + str(hour))
# 批次任务对应的东八区时间 减去 1小时后的 日期(例如:2021-04-30)
today_ = now_date.__format__('%Y-%m-%d')
today_time = now_date.__format__('%Y-%m-%d %H:00:00')
# 批次任务对应的东八区时间 减去 1小时后的 前一天日期(例如:2021-04-29)
yesterday_ = (now_time - timedelta(days=1)).__format__('%Y-%m-%d')
# 批次任务对应的东八区时间 减去 1小时后的 前二天日期(例如:2021-04-29)
yesterday_2 = (now_time - timedelta(days=2)).__format__('%Y-%m-%d')
# 批次任务对应的东八区时间 减去 1小时后的 前7天日期(例如:2021-04-23)
yesterday_7 = (now_time - timedelta(days=7)).__format__('%Y-%m-%d')
# 批次任务对应的东八区时间 减去 1小时后的 前30天日期(例如:2021-03-29)
yesterday_30 = (now_time - timedelta(days=30)).__format__('%Y-%m-%d')
# 批次任务对应的东八区时间 减去 1小时后的 日期(例如:20210430)
today = now_date.__format__('%Y%m%d')
# 批次任务对应的东八区时间 减去 1小时后的 前1天日期(例如:20210429)
yesterday = (now_time - timedelta(days=1)).__format__('%Y%m%d')
# 批次任务对应的东八区时间 减去 1小时后的 前7天日期(例如:20210423)
yesterday7 = (now_time - timedelta(days=7)).__format__('%Y%m%d')
# 0点批次用前天分区
yyd = yesterday_
if int(now_time.hour) == 0:
yyd = yesterday_2
conf_dict = dict(hour=hour, today_=today_, yesterday_=yesterday_, yesterday_2=yesterday_2, yesterday_7=yesterday_7,
today=today, yesterday=yesterday, yesterday7=yesterday7, now_time=now_time, week_n=week_n, yyd=yyd,
hour_str=hour_str, yesterday_30=yesterday_30,today_time = today_time
)
return conf_dict
二、Airflow宏调用
在Dag里调用
# 导入获取分区函数
from partitionConf import partitions
default_args = {
'owner': 'test',
'depends_on_past': False,
'ding_list': [''],
'retries': 3,
'retry_delay': timedelta(minutes=5),
'start_date': datetime.datetime(2020, 12, 1, 0, 0, 0)
}
dag = DAG(
dag_id='test',
default_args=default_args,
template_searchpath=[current_dir, BASE_DIR],
full_filepath=BASE_DIR,
description='宏测试',
catchup=False,
schedule_interval=SCHEDULE_CRON,
user_defined_macros={
"partitions": partitions,
}
TODAY = '{{ partitions(next_execution_date).today_ }}'
YESTERDAY = '{{ partitions(next_execution_date).yesterday_ }}'
HOUR = '{{ partitions(next_execution_date).hour }}'