如何在Airflow中格式化宏?

时间:2018-09-16 09:47:53

标签: airflow

我有以下内容:

EXEC_DATE1 = '{{ macros.ds_add(ds, 1) }}'


EXEC_DATE2 = '{{ execution_date }}'

我想创建如下路径变量:

path1 = EXEC_DATE1 + '/' + HH:MM (of EXEC_DATE1)
path2 = EXEC_DATE2 + '/' + HH:MM (of EXEC_DATE2)

最终应该像:

2018-09-16/10:41

我该怎么做?

我尝试过:

EXEC_DATE = '{{ execution_date }}'
EXEC_DATE = EXEC_DATE.strftime('%Y-%m-%d/%H:%M')

但是它给出了:

'str' object has no attribute 'strftime'

编辑: 我的代码:

EXEC_TIMESTAMP_PATH = "{{  execution_date.strftime('%Y-%m-%d/%H:%M') }}"
EXEC_DATE = "{{  execution_date.strftime('%H:%M') }}"
EXEC_TIME = "{{  mexecution_date.strftime('%Y-%m-%d') }}"

task3_op= BashOperator(
    task_id='task3',
    params={'EXEC_DATE':EXEC_DATE, 'EXEC_TIME':EXEC_TIME},
    bash_command="""python3 script.py '{{ var.value.task3_variable }}' '{{ params.EXEC_DATE }}' '{{ params.EXEC_TIME }}' 'file.json'""",
    dag=dag)

这不起作用。参数未呈现。

2 个答案:

答案 0 :(得分:1)

您需要执行以下操作:

EXEC_DATE = "{{ execution_date.strftime('%Y-%m-%d/%H:%M') }}"

strftime应该在花括号内使用。

如果需要下一个执行日期,请使用以下命令:

EXEC_DATE = "{{ next_execution_date.strftime('%Y-%m-%d/%H:%M') }}"

如果您只想添加timedelta

EXEC_DATE = "{{ (execution_date + macros.timedelta(days=1)).strftime('%Y-%m-%d/%H:%M') }}"

您的代码可以如下:

BASH_COMMAND="""
python3 script.py {{ var.value.task3_variable }} {{  execution_date.strftime('%H:%M') }} {{  execution_date.strftime('%Y-%m-%d') }} file.json
"""

task3_op= BashOperator(
    task_id='task3',
    bash_command=BASH_COMMAND,
    dag=dag)

答案 1 :(得分:1)

具体来说,在您的问题的代码中不起作用的是您的params上没有模板(宏扩展),但是您的bash_command上有模板。所以我敢打赌bash_command的渲染模板视图就像E.G。:

python3 script.py 'task3_variable's value' '{{  execution_date.strftime('%H:%M') }}' '{{  execution_date.strftime('%Y-%m-%d') }}' 'file.json'

这并没有得到进一步扩展,'可能也使Bash失去了意义,因为实际上您拥有:

params = { 'EXEC_DATE': "{{  execution_date.strftime('%H:%M') }}",
           'EXEC_TIME': "{{  execution_date.strftime('%Y-%m-%d') }}" }

因此,直接使用您在params的{​​{1}}中设置的模板来删除一级宏扩展,对您来说效果更好。

bash_command

调试此类问题时,应使用airflow render command或在UI的任务实例详细信息中检查呈现的视图。

这可能会向您显示假定的宏扩展出了什么问题。
此示例应呈现为类似的内容:

task3_op = BashOperator(
    task_id='task3',
    bash_command="""
python3 script.py '{{ var.value.task3_variable }}' \
'{{execution_date.strftime('%H:%M')}}' '{{execution_date.strftime('%Y-%m-%d')}}' file.json
    """,
    dag=dag)

您希望根据日期创建两条路径;尝试:

python3 script.py 'task3_variable's value' \
'12:21' '2018-09-16' file.json

Airflow 1.10还添加了task3_op= BashOperator( task_id='task3', bash_command=""" python3 script.py \ '{{ var.value.task3_variable }}' \ '{{(execution_date + macros.timedelta(days=1).strftime('%Y-%m-%d/%H:%M')}}' \ '{{execution_date.strftime('%Y-%m-%d/%H:%M')}}' \ file.json """, dag=dag) ,如果您的间隔是每天,则可能比向next_execution_date添加一天更适合您。