如何将python中的列表返回给dag?
我试图使用python操作符获取包含运行日期字符串的文件名列表,然后使用sftp-to-s3操作符下载这些文件。有更好的方法吗?使用下面的代码,我得到了错误>未找到的名称如何将python中的列表返回给dag?,python,airflow,apache-airflow-xcom,Python,Airflow,Apache Airflow Xcom,我试图使用python操作符获取包含运行日期字符串的文件名列表,然后使用sftp-to-s3操作符下载这些文件。有更好的方法吗?使用下面的代码,我得到了错误>未找到的名称 def get_files(**kwargs): sftp_hook = SFTPHook(ftp_conn_id='conn') str_date = kwargs["date"] files = [] with sftp_hook.get_conn() as conn:
def get_files(**kwargs):
sftp_hook = SFTPHook(ftp_conn_id='conn')
str_date = kwargs["date"]
files = []
with sftp_hook.get_conn() as conn:
for entry in conn.listdir_attr():
mode = entry.st_mode
if S_ISREG(mode) and str_date in entry.filename:
files.append(entry.filename)
return files -> list of files to download
with dag:
date = '{{ next_ds_nodash }}'
source_files = PythonOperator(task_id=f"get_files",
python_callable=get_files,
op_kwargs={'date': {date}},
provide_context=True,
dag=dag)
file_list = ti.xcom_pull(task_ids='get_files', key='files')
collect = []
for file in file_list:
op = SFTPToS3Operator(task_id=f"download_{file}",
sftp_conn_id="conn",
sftp_path=f"path1/{file}" if 'key' in file else f"path2/{file}",
s3_conn_id=aws_conn_id,
s3_bucket=s3_bucket,
s3_key =f"/temp/{date}/{file}",
dag=dag)
collect.append(op)
collect.set_upstream(source_files)
根据,XCOM类似于,因此必须序列化和反序列化。使用json.dumps()
和json.loads()
执行此操作
此外,您应该在另一个任务中使用xcom pull,而不是在DAG定义本身中
DAG应仅用于对各种任务ID的调用。执行任务中的所有操作,并在DAG中将它们链接在一起
这是一个例子
来自气流导入DAG
从afflow.operators.python导入PythonOperator
从airflow.utils.dates导入天\u
dag=dag(
“示例xcom”,
计划时间间隔=“一次”,
开始日期=日前(2),
默认参数={'owner':'afflow'},
标记=['example'],
)
值_1=[1,2,3]
值_2={'a':'b'}
def推送(**kwargs):
“”“推送没有特定目标的XCom”“”
kwargs['ti'].xcom\u push(key='value from pusher 1',value=value\u 1)
def按下按钮返回(**kwargs):
“”“只需返回XCom,就可以在没有特定目标的情况下推送XCom”“”
返回值_2
def拉具(**kwargs):
“”“拉取所有以前推送的XCOM,并检查推送的值是否与拉取的值匹配。”“”
ti=kwargs['ti']
#获取值1
pull\u value\u 1=ti.xcom\u pull(key=None,task\u id='push')
如果拉取\u值\u 1!=价值1:
raise VALUERROR(f'两个值不同{pulled_value_1}和{value_1}')
#获取值2
pull\u value\u 2=ti.xcom\u pull(任务\u id='push\u by\u returning')
如果拉取\u值\u 2!=价值2:
raise VALUERROR(f'两个值不同{pulled_value_2}和{value_2}')
#获取值_1和值_2
pulld\u value\u 1,pulld\u value\u 2=ti.xcom\u pull(key=None,task\u id=['push','push\u by\u returning'])
如果拉取\u值\u 1!=价值1:
raise VALUERROR(f'两个值不同{pulled_value_1}和{value_1}')
如果拉取\u值\u 2!=价值2:
raise VALUERROR(f'两个值不同{pulled_value_2}和{value_2}')
push1=蟒蛇算子(
任务_id='push',
dag=dag,
python_callable=push,
)
push2=蟒蛇算子(
task_id='push_by_returning',
dag=dag,
python\u callable=push\u by\u返回,
)
拉力=蟒蛇器(
任务\u id='puller',
dag=dag,
python_callable=puller,
)
pull根据,XCOM类似于,因此必须序列化和反序列化。使用json.dumps()
和json.loads()
执行此操作
此外,您应该在另一个任务中使用xcom pull,而不是在DAG定义本身中
DAG应仅用于对各种任务ID的调用。执行任务中的所有操作,并在DAG中将它们链接在一起
这是一个例子
来自气流导入DAG
从afflow.operators.python导入PythonOperator
从airflow.utils.dates导入天\u
dag=dag(
“示例xcom”,
计划时间间隔=“一次”,
开始日期=日前(2),
默认参数={'owner':'afflow'},
标记=['example'],
)
值_1=[1,2,3]
值_2={'a':'b'}
def推送(**kwargs):
“”“推送没有特定目标的XCom”“”
kwargs['ti'].xcom\u push(key='value from pusher 1',value=value\u 1)
def按下按钮返回(**kwargs):
“”“只需返回XCom,就可以在没有特定目标的情况下推送XCom”“”
返回值_2
def拉具(**kwargs):
“”“拉取所有以前推送的XCOM,并检查推送的值是否与拉取的值匹配。”“”
ti=kwargs['ti']
#获取值1
pull\u value\u 1=ti.xcom\u pull(key=None,task\u id='push')
如果拉取\u值\u 1!=价值1:
raise VALUERROR(f'两个值不同{pulled_value_1}和{value_1}')
#获取值2
pull\u value\u 2=ti.xcom\u pull(任务\u id='push\u by\u returning')
如果拉取\u值\u 2!=价值2:
raise VALUERROR(f'两个值不同{pulled_value_2}和{value_2}')
#获取值_1和值_2
pulld\u value\u 1,pulld\u value\u 2=ti.xcom\u pull(key=None,task\u id=['push','push\u by\u returning'])
如果拉取\u值\u 1!=价值1:
raise VALUERROR(f'两个值不同{pulled_value_1}和{value_1}')
如果拉取\u值\u 2!=价值2:
raise VALUERROR(f'两个值不同{pulled_value_2}和{value_2}')
push1=蟒蛇算子(
任务_id='push',
dag=dag,
python_callable=push,
)
push2=蟒蛇算子(
task_id='push_by_returning',
dag=dag,
python\u callable=push\u by\u返回,
)
拉力=蟒蛇器(
任务\u id='puller',
dag=dag,
python_callable=puller,
)
pull您不能在操作员外部调用file\u list=ti.xcom\u pull
。您不能在操作员外部调用file\u list=ti.xcom\u pull
。
from airflow import DAG
from airflow.operators.python import PythonOperator
from airflow.utils.dates import days_ago
dag = DAG(
'example_xcom',
schedule_interval="@once",
start_date=days_ago(2),
default_args={'owner': 'airflow'},
tags=['example'],
)
value_1 = [1, 2, 3]
value_2 = {'a': 'b'}
def push(**kwargs):
"""Pushes an XCom without a specific target"""
kwargs['ti'].xcom_push(key='value from pusher 1', value=value_1)
def push_by_returning(**kwargs):
"""Pushes an XCom without a specific target, just by returning it"""
return value_2
def puller(**kwargs):
"""Pull all previously pushed XComs and check if the pushed values match the pulled values."""
ti = kwargs['ti']
# get value_1
pulled_value_1 = ti.xcom_pull(key=None, task_ids='push')
if pulled_value_1 != value_1:
raise ValueError(f'The two values differ {pulled_value_1} and {value_1}')
# get value_2
pulled_value_2 = ti.xcom_pull(task_ids='push_by_returning')
if pulled_value_2 != value_2:
raise ValueError(f'The two values differ {pulled_value_2} and {value_2}')
# get both value_1 and value_2
pulled_value_1, pulled_value_2 = ti.xcom_pull(key=None, task_ids=['push', 'push_by_returning'])
if pulled_value_1 != value_1:
raise ValueError(f'The two values differ {pulled_value_1} and {value_1}')
if pulled_value_2 != value_2:
raise ValueError(f'The two values differ {pulled_value_2} and {value_2}')
push1 = PythonOperator(
task_id='push',
dag=dag,
python_callable=push,
)
push2 = PythonOperator(
task_id='push_by_returning',
dag=dag,
python_callable=push_by_returning,
)
pull = PythonOperator(
task_id='puller',
dag=dag,
python_callable=puller,
)
pull << [push1, push2]