Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将python中的列表返回给dag?_Python_Airflow_Apache Airflow Xcom - Fatal编程技术网

如何将python中的列表返回给dag?

如何将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:

我试图使用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:
        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]