Airflow DAG中的外部文件

时间:2017-03-23 17:27:57

标签: python airflow

我正在尝试访问Airflow任务中的外部文件来读取一些sql,而我收到“找不到文件”。有人遇到过这个吗?

from airflow import DAG
from airflow.operators.python_operator import PythonOperator
from datetime import datetime, timedelta

dag = DAG(
    'my_dat',
    start_date=datetime(2017, 1, 1),
    catchup=False,
    schedule_interval=timedelta(days=1)
)

def run_query():
    # read the query
    query = open('sql/queryfile.sql')
    # run the query
    execute(query)

tas = PythonOperator(
    task_id='run_query', dag=dag, python_callable=run_query)

日志状态如下:

IOError: [Errno 2] No such file or directory: 'sql/queryfile.sql'

据我所知,我可以简单地将查询复制并粘贴到同一个文件中,但实际上并不是很简洁。有多个查询,文本真的很大,嵌入Python代码会损害可读性。

3 个答案:

答案 0 :(得分:6)

以下是使用变量的示例,以简化操作。

  • 首先在Airflow UI - >中添加变量 Admin - > Variable,例如。 {key: 'sql_path', values: 'your_sql_script_folder'}

  • 然后在DAG中添加以下代码,以便使用您刚刚添加的Airflow变量。

DAG代码:

import airflow
from airflow.models import Variable

tmpl_search_path = Variable.get("sql_path")

dag = airflow.DAG(
   'tutorial',
    schedule_interval="@daily",
    template_searchpath=tmpl_search_path,  # this
    default_args=default_args
)
  • 现在您可以在文件夹Variable

  • 下使用sql脚本名称或路径
  • 您可以在this

  • 中了解详情

答案 1 :(得分:2)

所有相对路径均参考 AIRFLOW_HOME 环境变量。尝试:

  • 给出绝对路径
  • 将文件相对于 AIRFLOW_HOME
  • 放置
  • 尝试在python callable中记录 PWD ,然后决定要提供的路径(最佳选项)

答案 2 :(得分:0)

假设sql目录是相对于当前Python文件的,可以这样算出sql文件的绝对路径:

import os

CUR_DIR = os.path.abspath(os.path.dirname(__file__))

def run_query():
    # read the query
    query = open(f"{CUR_DIR}/sql/queryfile.sql")
    # run the query
    execute(query)