繁体   English   中英

气流定制jinja2过滤器

[英]Airflow custom jinja2 filters

我正在尝试为我的气流jinja2模板添加自定义过滤器。

因为我在S3中的文件夹就像

/年月日/

,我的目的是在变量屏幕中使用yesterday_ds,如下所示:

s3://logs.web.com/AWSLogs/ {{yesterday_ds | get_year}} / {{yesterday_ds | get_month}} / {{yesterday_ds | get_day}} /

我见过的PR(我认为这是已经合并..),你可以在DAG对象创建的dag_args参数参数“user_defined_filters”做到这一点这里

问题是,即使这样做,它也会说“没有名为get_year的过滤器”。

这是我的代码:

dag.py

   dag = DAG(
        dag_id='dag-name',
        default_args=utils.get_dag_args(user_defined_filters=utils.get_date_filters()),
        template_searchpath=tmpl_search_path,
        schedule_interval=timedelta(days=1),
        max_active_runs=1,
        )

utils.py

def get_dag_args(**kwargs):
return {
    'owner'               : kwargs.get('owner', 'owner_name'),
    'depends_on_past'     : kwargs.get('depends_on_past', False),
    'start_date'          : kwargs.get('start_date', datetime.now() - timedelta(1)),
    'email'               : kwargs.get('email', ['blabla@blabla.com']),
    'retries'             : kwargs.get('retries', 5),
    'provide_context'     : kwargs.get('provide_context', True),
    'retry_delay'         : kwargs.get('retry_delay', timedelta(minutes=5)),
    'user_defined_filters': get_date_filters()
    }


def get_date_filters():
    return dict(
        get_year=lambda date_string: date_string.strftime('%Y'),
        get_month=lambda date_string: date_string.strftime('%m'),
        get_day=lambda date_string: date_string.strftime('%d'),
        )

有人看到我弄错了吗? 谢谢!

编辑

在dag定义后打印这个,不幸的是显示没有自定义过滤器:(。

jinja_env = dag.get_template_env()
print(jinja_env.filters)

此外,如果我尝试将其直接添加为DAG对象参数,如test @ tests / models.py中所示:

Broken DAG: [/home/ubuntu/airflow/dags/dag.py] __init__() got an unexpected keyword argument 'user_defined_filters'

编辑2

好吧,我看到的是我有1.8.0版本,而且这个没有过滤器。 有谁知道如何通过点子下载1.8.2rc? 或者我们不能?

Airflow现在支持自定义过滤器和宏

工作代码示例:

from airflow import DAG
from datetime import datetime, timedelta

def first_day_of_month(any_day):
    return any_day.replace(day=1)


def last_day_of_month(any_day):
    next_month = any_day.replace(day=28) + timedelta(days=4)  # this will never fail
    return next_month - timedelta(days=next_month.day)


def isoformat_month(any_date):
    return any_date.strftime("%Y-%m")


with DAG(
        dag_id='generate_raw_logs',
        default_args=default_args,
        schedule_interval=timedelta(minutes=120),
        catchup=False,
        user_defined_macros={
            'first_day_of_month': first_day_of_month,
            'last_day_of_month': last_day_of_month,
        },
        user_defined_filters={
            'isoformat_month': isoformat_month
        }
)

气流包装名称已在点子上更改。 1.8.2rc1可以使用pip install apache-airflow下载。

另请注意,根据填充列表,他们目前正在努力将1.8.2rc4发布为1.8.2。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM