2021-10-09

一、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 }}'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值