airflow - 如何将 BigQueryOperator 与 execution_date 一起使用?
问题描述
这是我的代码:
EXEC_TIMESTAMP = "{{ execution_date.strftime('%Y-%m-%d %H:%M') }}"
query = """
select ... where date_purchased between TIMESTAMP_TRUNC(cast ( {{ params.run_timestamp }} as TIMESTAMP), HOUR, 'UTC') ...
"""
generate_op = BigQueryOperator(
bql=query,
destination_dataset_table=table_name,
task_id='generate',
bigquery_conn_id=CONNECTION_ID,
use_legacy_sql=False,
write_disposition='WRITE_TRUNCATE',
create_disposition='CREATE_IF_NEEDED',
query_params={'run_timestamp': EXEC_TIMESTAMP},
dag=dag)
这应该工作,但它没有。渲染选项卡向我显示:
between TIMESTAMP_TRUNC(cast ( as TIMESTAMP), HOUR, 'UTC')
日期不见了。它被渲染成虚无。
我怎样才能解决这个问题?该运算符没有provide_context=True
。我不知道该怎么办。
解决方案
Luis,这query_params
不是params
您可以在模板上下文中引用的。它们没有添加到其中。由于params
是空的,你{{ params.run_timestamp }}
的要么是""
要么None
。如果您将其更改为params={'run_timestamp':…}
它仍然会有问题,因为params
值没有模板化。因此,当您使用模板化字段bql
来包含时{{ params.run_timestamp }}
,您将获得准确params: {'run_timestamp': …str… }
填写的内容,而无需对该值进行任何递归扩展。你应该得到{{ execution_date.strftime('%Y-%m-%d %H:%M') }}
.
让我尝试为您重新编写此代码(但我可能错误地将括号转换为错误,不确定):
generate_op = BigQueryOperator(
sql="""
select ...
where date_purchased between
TIMESTAMP_TRUNC(cast('{{execution_date.strftime('%Y-%m-%d %H:%M')}}') as TIMESTAMP), HOUR, 'UTC')
...
""",
destination_dataset_table=table_name,
task_id='generate',
bigquery_conn_id=CONNECTION_ID,
use_legacy_sql=False,
write_disposition='WRITE_TRUNCATE',
create_disposition='CREATE_IF_NEEDED',
dag=dag,
)
您可以看到bql
和sql
字段是模板化的。但是,该bql
字段已被弃用并在以后的代码中被删除。
推荐阅读
- r - 在 R 中的 mlogit 中指定随机效应(有人可以与 lme4 进行比较吗?)
- java - 设置 Spring Native Experimental(在以下任何来源中均未找到 id 'org.springframework.experimental.aot' 版本 '0.10.3')
- java - 如何在不删除任何潜在重复项的情况下从字符串中删除参数?
- flutter - Flutter Moor 插入阵列
- python - 如何使用 Python 同时从服务器获取多个数据?
- xml - 在火花中读取 xml 文件时从 xml 属性中提取值
- java - Junit Jupiter 5.8.x ClassOrder
- excel - 用 VBA 将月份除以周数
- streaming - 以编程方式将视频从内置 wifi ip 摄像头流式传输到 android 设备
- mongodb - 如何为 mongodb 编写相关的 $lookup 查询?