Airflow 使用ds_添加和带有气流的宏
我想以Airflow 使用ds_添加和带有气流的宏,airflow,Airflow,我想以YYYY-MM-DD HH:MM 这是我写的: EXEC_TIMESTAMP_2_MONTHS_AGO = "{{ macros.ds_add(execution_date.strftime('%Y-%m-%d/%H:%M'), -60) }}" 然而,这不起作用。它无法渲染 有什么问题 编辑: 这是接线员: import_orders_op = MySqlToGoogleCloudStorageOperator( task_id='import_orders_and_uploa
YYYY-MM-DD HH:MM
这是我写的:
EXEC_TIMESTAMP_2_MONTHS_AGO = "{{ macros.ds_add(execution_date.strftime('%Y-%m-%d/%H:%M'), -60) }}"
然而,这不起作用。它无法渲染
有什么问题
编辑:
这是接线员:
import_orders_op = MySqlToGoogleCloudStorageOperator(
task_id='import_orders_and_upload_to_storage',
mysql_conn_id='mysqlcon',
google_cloud_storage_conn_id='gcpcon',
provide_context=True,
sql = 'import_orders.sql',
params={'max_Orders_ID_2_months_ago': EXEC_TIMESTAMP_2_MONTHS_AGO, 'table_name' : TABLE_NAME},
bucket=GCS_BUCKET_ID,
filename=file_name,
dag=dag)
错误是:
mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '{ (execution_date - macros.timedelta(days=60)).strftime('%Y-%m-%d %H:%M') }}\n ' at line 51")
理想情况下,你应该在你的帖子中包含来自日志的任何错误消息,这将有助于未来的搜索者,也有助于缩小问题的范围 我认为现在的情况是,您使用的是
ds\u add
,但是在执行日期,这是一个合适的日期时间。通常它是在ds
上完成的,ds是一种字符串表示形式
相反,您需要直接从执行日期中减去,然后按照您想要的方式格式化它
{{ (execution_date - macros.timedelta(days=60)).strftime('%Y-%m-%d/%H:%M') }}
为了完整性-该计算只能在模板化sql或模板化sql文件中进行。理想情况下,您应该在帖子中包含日志中的任何错误消息,这将有助于未来的搜索者,也有助于缩小问题范围 我认为现在的情况是,您使用的是
ds\u add
,但是在执行日期,这是一个合适的日期时间。通常它是在ds
上完成的,ds是一种字符串表示形式
相反,您需要直接从执行日期中减去,然后按照您想要的方式格式化它
{{ (execution_date - macros.timedelta(days=60)).strftime('%Y-%m-%d/%H:%M') }}
为了完整性-该计算只能在模板化sql或模板化sql文件中进行。IIRC参数值不会被模板化。因此,字符串值被显式传入 您的示例运算符正在加载
import\u orders.sql
。因此,假设您正在使用其中的某个模板宏来加载params dict中的值。宏永远不会递归展开。因此,只需将建议的模板(执行日期减去60天间隔)和所需的字符串格式直接放入具有params宏的sql文件中
例如,如果您的SQL文件看起来像:
SELECT * FROM {{ params.table_name }}
WHERE ID > {{ params.max_Orders_ID_2_months_ago }};
我建议您输入(更正的)宏:
因为
macros.ds_add(ds,-60)
首先只在%Y-%m-%d
字符串上工作,比如{ds}
,并且只在%Y-%m-%dIIRC中输出字符串,所以参数值不会被模板化。因此,字符串值被显式传入
您的示例运算符正在加载import\u orders.sql
。因此,假设您正在使用其中的某个模板宏来加载params dict中的值。宏永远不会递归展开。因此,只需将建议的模板(执行日期减去60天间隔)和所需的字符串格式直接放入具有params宏的sql文件中
例如,如果您的SQL文件看起来像:
SELECT * FROM {{ params.table_name }}
WHERE ID > {{ params.max_Orders_ID_2_months_ago }};
我建议您输入(更正的)宏:
因为macros.ds\u add(ds,-60)
首先只对%Y-%m-%d
字符串(如{ds}
)起作用,并且只在%Y-%m-%d
中输出字符串,所以这也不起作用。这应该替换为我在mysqltologlecloudstorageoperator查询中使用的时间戳。错误是:ProgrammingError:(1064),“您的SQL语法有错误;请查看与您的MySQL服务器版本对应的手册,以了解在{(execution_date-macro,这实际上意味着该值没有被重新定义。您可以编辑您的帖子以包含该错误消息以及如何从运算符调用它吗?这也不起作用。这应该替换为我在查询mysqltologlecloudstorageoperator时使用的时间戳。错误是:ProgrammingError:(1064,)您的SQL语法有错误;请查看与您的MySQL服务器版本对应的手册,以了解在“{(execution_date-macro)附近使用的正确语法,这实际上意味着该值未重新编辑。您可以编辑日志以包含该错误消息以及如何从操作调用它吗?您应该尝试放置{{…
导入模板化的import\u orders.sql
-我假设它是基于以前的question@Mendhak查看我对Dlamblin的评论我们说直接将其放入SQL文件,只使用params
传递所需的最基本值,而此计算可以在.SQL
文件中进行。您应该我试着把{{…
导入模板化的import\u orders.sql
-我假设它是基于以前的question@Mendhak查看我对Dlamblin的评论我们说直接将其放入SQL文件,只使用参数
传递所需的最基本值,而此计算可以在.SQL
文件中进行。如何放置?当我这样做时:params={'max_Orders_ID_2_months_ago':'{{(执行日期-macros.timedelta(days=60)).strftime(“%Y-%m-%d%H:%m”)}},'table_name':BQ_table_name},
它给出了无效语法
@Programmer120这是一个由手机编写的回复,重要的开场白被弄乱了。我修复了它。是的,在你的评论的代码中,'
是一个空字符串,不与dict{…}
。您可能应该在venv中安装apache airflow,然后再将代码放入正在运行的系统中cd$DAGS\u目录;PYTHONPATH=.python-c'从pprint导入pprint;从path.to.dag\u文件导入dag\u变量;pprint(dag\u变量);'
如何放置?当我这样做时:参数={max\u Orders\ID\u 2个月前]:'{{(执行日期-macros.timedelta(天=60)).strftime(“%Y-%m-%d%H:%m”)}}“”,“表名称”:BQ\U表名称},
它给出了无效语法
@Programmer120这是一个由手机编写的回复,重要的开场白被弄乱了。我修复了它。是的,在你的评论的代码中,'
是一个空字符串,不与dict{…}
。在将代码放入正在运行的系统之前,您可能应该在venv中安装apache airflow