繁体   English   中英

气流ETL管道 - 在功能中使用计划日期?

[英]Airflow ETL pipeline - using schedule date in functions?

是否可以在Python函数中引用default_args start_date?

default_args = {
    'owner': 'airflow', 
    'depends_on_past': False, 
    'start_date': datetime(2016, 11, 21),
    'email': ['mmm.mm@mmm.com'], 
    'email_on_failure': True, 
    'email_on_retry': True,
    'retries': 1, 
    'retry_delay': timedelta(minutes=1)
}

我的python脚本主要使用subprocess来发出这个语句:

query = '"SELECT * FROM {}.dbo.{} WHERE row_date = \'{}\'"'.format(database,                                                             select_database(database)[table_int],
                                                                       query_date)
command = 'BCP {} queryout \"{}\" -t, -c -a 10240 -S "server" -T'.format(query, os.path.join(path, filename))

我想要运行的任务是使用BCP查询'select * from table where date = {}'。 目前,我的python脚本具有日期变量的所有逻辑(默认为昨天)。 但是,最好引用default_arg并让气流处理日期。

因此,为了简化,我想使用default_arg start_date和schedule(每天运行)来填充我的BCP命令中的变量。 这是正确的方法还是我应该在python脚本中保留日期逻辑?

这是正确的方法,但你真正需要的是execution_date ,而不是start_date 您可以使用provide_context=True参数通过provide_context=True的上下文将execution_date作为'ds'默认变量。 provide_context=True参数通过kwargs参数传递Jinja provide_context=True使用的一组默认变量。 您可以在文档的相关部分中阅读有关Default Variables和Jinja Templating的更多信息。 https://airflow.incubator.apache.org/code.html#default-variables https://airflow.incubator.apache.org/concepts.html#jinja-templating

您的代码应如下所示:

def query_db(**kwargs):
    #get execution date in format YYYY-MM-DD
    query_date = kwargs.get('ds') 

    #rest of your logic

t_query_db = PythonOperator( task_id='query_db', python_callable=query_db, provide_context=True, dag=dag)

暂无
暂无

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

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