簡體   English   中英

創建唯一文件名並在所有氣流任務中訪問該文件

[英]Create Unique file name and access that file in all airflow task

每次氣流 dag 運行並從所有任務訪問該文件時,我們是否可以創建唯一的文件名? 我嘗試創建全局變量 (output_filename) 並為其附加時間戳。 但是當我在任務中訪問該文件名時,每個任務都會生成不同的文件名,因為它正在計算每個任務中的時間戳。 下面是示例代碼:

table_name = 'Test_ABC'
start_date = datetime.now()
cur_tmpstp = start_date.strftime('%Y_%m_%d')

output_filename = table_name + "_" + cur_tmpstp + ".csv"
S3_landing_path = "s3://abc/"

def clean_up():
    if os.path.exists(output_filename):
        os.remove(output_filename)


task_1 = BashOperator(
    task_id='task_1',
    bash_command="aws s3 cp %s %s/ " %(output_filename, S3_landing_path, ),
    dag=dag)

task_2_cleanup = PythonOperator(
    task_id='task_2_cleanup',
    python_callable=clean_up,
    dag=dag)

我們有更多的任務需要訪問 output_filename。 我們如何在所有任務中訪問 output_filename 全局變量?

如果您只需要具有日期粒度的時間戳,那么您可以使用帶有模板的默認變量。 此類變量的一些示例(取自http://airflow.readthedocs.io/en/latest/code.html#default-variables )是

{{ ds }}    the execution date as YYYY-MM-DD
{{ ds_nodash }}     the execution date as YYYYMMDD
{{ execution_date }}    the execution_date, (datetime.datetime)

如果您需要具有時間粒度的時間戳,則可以使用全局變量和帶有 python 運算符的任務:

DAG_NAME = 'Some DAG name'

ts = Variable.get(f"{DAG_NAME}_ts", default_var=None)

def generate_ts(*args, **kwargs):
    ts = datetime.now().isoformat()
    Variable.set(f"{DAG_NAME}_ts", ts)

generate_ts_task = PythonOperator(
    task_id='generate_ts',
    python_callable=generate_ts,
    dag=dag,
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM