我有以下内容:
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)
这不起作用。参数未呈现。
答案 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
添加一天更适合您。