Python DAG中的外部文件
我试图在一个任务中访问外部文件以读取一些sql,结果得到“找不到文件”。有人见过这个吗Python DAG中的外部文件,python,airflow,Python,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
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代码会影响可读性 所有相关路径均参考气流_HOME环境变量。尝试:
- 给出绝对路径
- 将文件放置在相对于主视图的位置
- 尝试将PWD记录在python可调用文件中,然后决定给出什么路径(最佳选项)
- 首先在
->气流UI
管理
->
变量中添加变量,例如
{key:'sql\u path',value:'your\u sql\u script\u folder'}
- 然后在DAG中添加以下代码,以使用刚添加的气流变量
- 现在,您可以在文件夹变量下使用sql脚本名称或路径
- 你可以从中了解更多
- 下面是一个示例,使用变量可以简化操作
导入气流
从airflow.models导入变量
tmpl\u search\u path=Variable.get(“sql\u path”)
dag=气流。dag(
“教程”,
计划时间间隔=“每日”,
template_searchpath=tmpl_search_path,#这个
默认参数=默认参数
)
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)
好的评论,但不幸的是,AIRFLOW_HOME是一个可选的环境变量-如果没有它,AIRFLOW就可以正常工作-您不能保证它会被设置。请提供一个完整的示例。定义
template\u searchpath
,这会改变整个脚本行为,我现在可以通过文件名引用该文件吗?例如,这将完成您的示例:```使用open(query\u file\u name,'r')作为file:query\u content=file.read()````我认为这不适用于OP使用的示例DAG和Python的本机open()
。PythonOperator运行在一个pod中,该pod与解析DAG的进程无权访问同一组位置。@RicardoMS嗨,当您想定义自己的aiffort.models.Variable
时,最简单的方法是通过aiffort UI,主页->管理->变量来创建新变量,例如:{'Key':'RicardoMS_variable','Val':'/opt/specific/path'}
完成后,可以使用示例代码通过tmpl\u search\u path=variable.get(“RicardoMS_variable”)
加载变量,而不是直接使用'/opt/specific/path'