在我的模板(XXX.sql)中,我有:
{{ params.etl_date if params.etl_date is not none else execution_date.strftime('%Y%m%d') }}
然后在我的BigQueryOperator中:
BigQueryOperator(task_id='XXX',
bigquery_conn_id=GOOGLE_CLOUD_PLATFORM_CONNECTION_ID,
write_disposition='WRITE_TRUNCATE',
create_disposition='CREATE_IF_NEEDED',
sql='XXX.sql',
schema=None,
use_legacy_sql=False,
destination_dataset_table=XXX,
params={
'etl_date': '20200605'
})
它可以工作,但可以:
BigQueryOperator(task_id='XXX',
bigquery_conn_id=GOOGLE_CLOUD_PLATFORM_CONNECTION_ID,
write_disposition='WRITE_TRUNCATE',
create_disposition='CREATE_IF_NEEDED',
sql='XXX.sql',
schema=None,
use_legacy_sql=False,
destination_dataset_table=XXX,
# NO PARAMS
)
我似乎可以访问并格式化执行日期?它只是返回一个空字符串。有什么建议吗?
答案 0 :(得分:1)
在第二种情况下,您可以设置:
params={ 'etl_date': None}
答案 1 :(得分:1)
要添加到Sergiy的响应中,这取决于您要进行干预的位置。 Sergiy's是它与模板一起工作的唯一方法:
{{ params.etl_date if params.etl_date is not None else execution_date.strftime('%Y%m%d') }}
在这种情况下,您必须提供明确的None
来提供它的原因是由于可以安全地解释和渲染模板。在dictionary.get(key, "")
下有一个与params.etl_date
等效的...只是因为在构建字符串或文本模板时这是安全的。
您可能想做的就是明确使用它,并将模板更改为:
{{ params.etl_date if params.etl_date else execution_date.strftime('%Y%m%d') }}
这是因为params.etl_date
默认返回的空字符串将被Python评估为False
。