获取BashOperator
或SqlOperator
为其模板获取外部文件的方法有一些明确记录,但请查看PythonOperator
我对我所理解的内容的测试docs不起作用。我不确定templates_exts
和templates_dict
参数如何正确交互以获取文件。
在我的dags文件夹中,我创建了:pyoptemplate.sql
和pyoptemplate.t
以及test_python_operator_template.py
:
SELECT * FROM {{params.table}};
SELECT * FROM {{params.table}};
# coding: utf-8
# vim:ai:si:et:sw=4 ts=4 tw=80
"""
# A Test of Templates in PythonOperator
"""
from airflow import DAG
from airflow.operators.python_operator import PythonOperator
from datetime import datetime
import pprint
pp = pprint.PrettyPrinter(indent=4)
def templated_function(ds, **kwargs):
"""This function will try to use templates loaded from external files"""
pp.pprint(ds)
pp.pprint(kwargs)
# Define the DAG
dag = DAG(dag_id='test_python_operator_template_dag',
default_args={"owner": "lamblin",
"start_date": datetime.now()},
template_searchpath=['/Users/daniellamblin/airflow/dags'],
schedule_interval='@once')
# Define the single task in this controller example DAG
op = PythonOperator(task_id='test_python_operator_template',
provide_context=True,
python_callable=templated_function,
templates_dict={
'pyoptemplate': '',
'pyoptemplate.sql': '',
'sql': 'pyoptemplate',
'file1':'pyoptemplate.sql',
'file2':'pyoptemplate.t',
'table': '{{params.table}}'},
templates_exts=['.sql','.t'],
params={'condition_param': True,
'message': 'Hello World',
'table': 'TEMP_TABLE'},
dag=dag)
运行结果显示table
被正确模板化为字符串,但其他人没有提取任何文件进行模板化。
dlamblin$ airflow test test_python_operator_template_dag test_python_operator_template 2017-01-18
[2017-01-18 23:58:06,698] {__init__.py:36} INFO - Using executor SequentialExecutor
[2017-01-18 23:58:07,342] {models.py:154} INFO - Filling up the DagBag from /Users/daniellamblin/airflow/dags
[2017-01-18 23:58:07,620] {models.py:1196} INFO -
--------------------------------------------------------------------------------
Starting attempt 1 of 1
--------------------------------------------------------------------------------
[2017-01-18 23:58:07,620] {models.py:1219} INFO - Executing <Task(PythonOperator): test_python_operator_template> on 2017-01-18 00:00:00
'2017-01-18'
{ u'END_DATE': '2017-01-18',
u'conf': <module 'airflow.configuration' from '/Library/Python/2.7/site-packages/airflow/configuration.pyc'>,
u'dag': <DAG: test_python_operator_template_dag>,
u'dag_run': None,
u'ds_nodash': u'20170118',
u'end_date': '2017-01-18',
u'execution_date': datetime.datetime(2017, 1, 18, 0, 0),
u'latest_date': '2017-01-18',
u'macros': <module 'airflow.macros' from '/Library/Python/2.7/site-packages/airflow/macros/__init__.pyc'>,
u'params': { 'condition_param': True,
'message': 'Hello World',
'table': 'TEMP_TABLE'},
u'run_id': None,
u'tables': None,
u'task': <Task(PythonOperator): test_python_operator_template>,
u'task_instance': <TaskInstance: test_python_operator_template_dag.test_python_operator_template 2017-01-18 00:00:00 [running]>,
u'task_instance_key_str': u'test_python_operator_template_dag__test_python_operator_template__20170118',
'templates_dict': { 'file1': u'pyoptemplate.sql',
'file2': u'pyoptemplate.t',
'pyoptemplate': u'',
'pyoptemplate.sql': u'',
'sql': u'pyoptemplate',
'table': u'TEMP_TABLE'},
u'test_mode': True,
u'ti': <TaskInstance: test_python_operator_template_dag.test_python_operator_template 2017-01-18 00:00:00 [running]>,
u'tomorrow_ds': '2017-01-19',
u'tomorrow_ds_nodash': u'20170119',
u'ts': '2017-01-18T00:00:00',
u'ts_nodash': u'20170118T000000',
u'yesterday_ds': '2017-01-17',
u'yesterday_ds_nodash': u'20170117'}
[2017-01-18 23:58:07,634] {python_operator.py:67} INFO - Done. Returned value was: None
答案 0 :(得分:11)
从Airflow 1.8开始,PythonOperator取代template_ext
中__init__
字段的方式不起作用。任务仅检查template_ext
上的__class__
。要创建一个拾取SQL模板文件的PythonOperator,您只需执行以下操作:
class SQLTemplatedPythonOperator(PythonOperator):
template_ext = ('.sql',)
然后在运行时从您的任务中访问SQL:
SQLTemplatedPythonOperator(
templates_dict={'query': 'my_template.sql'},
params={'my_var': 'my_value'},
python_callable=my_func,
provide_context=True,
)
def my_func(**context):
context['templates_dict']['query']
答案 1 :(得分:9)
最近我遇到了同样的问题并最终解决了它。 @Ardan的解决方案是正确的,但只想重复一个更完整的答案,并详细介绍Airflow如何为新手工作。
当然,您首先需要其中一个:
from airflow.operators.python_operator import PythonOperator
class SQLTemplatedPythonOperator(PythonOperator):
# somehow ('.sql',) doesn't work but tuple of two works...
template_ext = ('.sql','.abcdefg')
假设您有一个如下所示的sql模板文件:
# stored at path: $AIRFLOW_HOME/sql/some.sql
select {{some_params}} from my_table;
首先确保将文件夹添加到dag参数中的搜索路径。
不要将template_searchpath传递给args然后将args传递给DAG !!!!它没有用。
dag = DAG(
dag_id= "some_name",
default_args=args,
schedule_interval="@once",
template_searchpath='/Users/your_name/some_path/airflow_home/sql'
)
然后您的接线员将是
SQLTemplatedPythonOperator(
templates_dict={'query': 'some.sql'},
op_kwargs={"args_directly_passed_to_your_function": "some_value"},
task_id='dummy',
params={"some_params":"some_value"},
python_callable=your_func,
provide_context=True,
dag=dag,
)
您的功能将是:
def your_func(args_directly_passed_to_your_function=None):
query = context['templates_dict']['query']
dome_some_thing(query)
一些解释:
Airflow使用上下文中的值来渲染模板。要手动将其添加到上下文中,您可以使用上面的参数字段。
PythonOperator不再从template_ext字段中获取模板文件扩展名,就像提到的@Ardan一样。源代码为here。 它只需要从 self .__ class __。template_ext 进行扩展。
气流循环遍历template_dict字段,如果value.endswith(file_extension)== True,则呈现模板。
答案 2 :(得分:8)
我认为这不可能。但以下解决方法可能会有所帮助:
obj
不过会喜欢更好的解决方案!
答案 3 :(得分:1)
无法获取在python中模板化的脚本文件(python新手)。但是有一个关于bash运算符的例子,可能会给你一些提示
from datetime import datetime
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
default_args = {
'owner': 'airflow',
'depends_on_past': False,
#'start_date': airflow.utils.dates.days_ago(2),
'email': ['airflow@airflow.com']}
dag = DAG('sr5', description='Simple tutorial DAG',
schedule_interval='0 12 * * *',
start_date=datetime(2017, 3, 20),
catchup=False, #so that on scehduler restart, it doesn't try to catchup on all the missed runs
template_searchpath=['/Users/my_name/Desktop/utils/airflow/resources'])
t1 = BashOperator(
task_id='t1',
depends_on_past=False,
params={
'ds1': 'hie'},
bash_command="01.sh",
dag=dag)
01.sh脚本如下所示
#!/bin/sh
echo {{ ds }}
echo {{ params.ds1 }}
这在测试执行时给出如下输出
[2017-05-12 08:31:52,981] {bash_operator.py:91}信息 - 输出:
[2017-05-12 08:31:52,984] {bash_operator.py:95} INFO - 2017-05-05
[2017-05-12 08:31:52,984] {bash_operator.py:95} INFO - hie