每次气流dag运行并从所有任务访问该文件时,我们可以创建唯一的文件名吗? 我尝试创建全局变量(output_filename)并为其添加时间戳。 但是当我在任务中访问该file_name时,每个任务都会生成不同的文件名,因为它正在计算每个任务中的时间戳。 以下是示例代码:
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全局变量?
答案 0 :(得分:2)
如果您只需要具有日期粒度的时间戳,则可以使用带模板的默认变量。这些变量的一些例子(取自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)
答案 1 :(得分:0)
如果您需要具有时间粒度的时间戳,则可以使用全局变量和带有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,
)