Airflow 如何使用具有执行日期的BigQueryOperator?

Airflow 如何使用具有执行日期的BigQueryOperator?,airflow,Airflow,这是我的代码: 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 = BigQ

这是我的代码:

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')
日期不见了。它被渲染成了虚无


我怎样才能解决这个问题?此运算符没有
提供\u context=True
。我不知道该怎么办。

路易斯,
查询参数
不是您可以在模板上下文中参考的
参数。它们没有添加到它中。由于
params
为空,因此您的
{{params.run\u timestamp}
要么是
要么是
None
。如果将其更改为
params={'run_timestamp':…}
它仍然会有问题,因为
params
值没有模板化。因此,当您使用模板化字段
bql
来包含
{{params.run\u timestamp}}
时,您将准确地得到
params:{'run\u timestamp':…str.}
中填充的内容,而不需要对该值进行任何递归扩展。您应该获得
{{execution\u date.strftime(“%Y-%m-%d%H:%m”)}

让我试着为你重新写这篇文章(但我可能没有正确地安排帕伦夫妇的角色,不确定):


你可以。但是,在后面的代码中。

问题是您使用的是
query_params
,它不是@dlamblin提到的模板字段

使用以下代码直接在
bql
中使用执行日期:

导入气流
从airflow.models导入DAG,变量
从airflow.operators.dummy_operator导入dummy operator
从afflow.operators.python_operator导入PythonOperator
从datetime导入datetime,timedelta
从afflow.contrib.operators.bigquery_operator导入BigQueryOperator
导入操作系统
CONNECTION\u ID=Variable.get(“您的\u连接”)
args={
“所有者”:“气流”,
“开始日期”:日期时间(2018、12、27、11、15),
“重试次数”:4次,
“重试延迟”:时间增量(分钟=10)
}
dag=dag(
dag_id='My_Test_dag',
默认值_args=args,
附表_interval='15****',
最大有效运行次数=1,
catchup=False,
)
query=“”选择客户的电子邮件地址作为电子邮件,
从mytable
哪里
购买日期=时间戳(时间戳(强制转换({execution\u date.strftime(“%Y-%m-%d%H:%m')}})作为时间戳),小时,“UTC”),间隔1小时)
创建订单临时表格op=BigQueryOperator(
bql=查询,
目的地\u数据集\u table='some table',
任务\u id='create\u orders\u temp\u table',
bigquery\u conn\u id=连接\u id,
使用\u legacy\u sql=False,
write_disposition='write_TRUNCATE',
create_disposition='create_IF_NEEDED',
dag=dag)
start_task_op=dummy运算符(task_id='start_task',dag=dag)
开始任务>>创建订单临时表格

我也尝试了这个方法,但它无法渲染。它使用它作为字符串。这个操作符没有提供上下文=true。你提到的其他地方,你使用的是v1.9,其中你必须使用
bql
而不是
sql
,但是是的……定义了模板上下文,它对于dag运行中的所有任务基本上是相同的,并且应该总是包含
执行日期
,所以我很惊讶地听说它没有直接使用时为您展开该模板。它确实呈现,因为我在呈现页面中看到它,但没有任何值(粘贴了问题中的示例)。这可能是一个bug。@Luis毫无疑问,如果您在定义dag_运行和任务_实例的基础上得到了执行日期为
None
,就会出现某种bug。这只限于BigQueryOperator?你似乎在报告一个蟒蛇操作员的一些成功(作为一种工作方法)。显然有一个bug。我通过添加PythonOperator来呈现SQL—将其保存到文件中,然后BigQueryOperator从文件中读取SQL而无需呈现它。我真的希望他们能解决这个问题。BigQueryOpeartor应用广泛,
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,
)