在BashOperator Airflow中解压缩.gz文件后,如何xcom_push获得的文件?

时间:2019-08-09 13:12:24

标签: bash gzip airflow apache-airflow-xcom

我正在使用BashOperator在Airflow中解压缩.gz文件。

gzip -d archive_name.csv.gz

因此,gzip命令将原始.gz文件替换为解压缩的archive_name.csv文件

我在Airflow中的任务

gzip_file = BashOperator(
    task_id = "gzip_file",
    bash_command = "gzip -d archive_name.csv.gz",
    dag=dag
)

现在我需要知道Airflow中其他任务的文件名,因此我希望任务gzip_file应该使用xcom推送文件名,以便我的其他任务可以提取文件名并使用它。我该怎么办?

2 个答案:

答案 0 :(得分:1)

假设您正在运行最新版本的Ariflow,则可以将do_xcom_push [1]设置为true,并在您最后一个写入标准输出的命令中回显解压缩的文件,其余部分由气流完成

  

如果BaseOperator.do_xcom_push为True,则最后一行写入stdout   bash命令完成时也将被推送到XCom

然后,下游任务可以使用xcom pull来获取该文件名[2]

[1] https://github.com/apache/airflow/blob/45244e38d386f20838a2cc85fbc72edca843a5e1/airflow/operators/bash_operator.py#L34
[2] https://github.com/apache/airflow/blob/master/airflow/example_dags/example_xcom.py

答案 1 :(得分:0)

BashOperator具有参数xcom_push。如果xcom_push为True,则在bash命令完成时,写入stdout的最后一行也将被推送到XCom。

运行bash命令,使最后一行包含未压缩文件的名称。

gzip_file = BashOperator(
    task_id = "gzip_file",
    bash_command = "gzip -d archive_name.csv.gz | ls archive_name.csv",
    xcom_push=True,
    dag=dag
)