在Airflow中将Jinja模板变量与BigQueryOperator结合使用

时间:2019-07-30 21:47:33

标签: google-bigquery airflow google-cloud-composer

我正在尝试通过使用变量填充sql=属性来在Airflow中使用BigQueryOperator。我遇到的问题是使用Jinja变量时文件扩展名被删除。我将代码设置如下:

dag = DAG(
    dag_id='data_ingest_dag',
    template_searchpath=['/home/airflow/gcs/dags/sql/'],
    default_args=DEFAULT_DAG_ARGS
)

bigquery_transform = BigQueryOperator(
    task_id='bq-transform',
    write_disposition='WRITE_TRUNCATE',
    sql="{{dag_run.conf['sql_script']}}",
    destination_dataset_table='{{dag_run.conf["destination_dataset_table"]}}',
    dag=dag
)

传递的变量包含存储在单独的SQL目录中的SQL文件的名称。如果我将值作为静态字符串sql="example_file.sql"传递,则一切正常。但是,当我使用Jinja模板变量传递example_file.sql时,它会自动删除文件扩展名,并且我收到此错误:

BigQuery job failed.
Final error was: {u'reason': u'invalidQuery', u'message': u'Syntax error: Unexpected identifier "example_file" at [1:1]', u'location': u'query'}

此外,我还尝试将“ .sql”硬编码到变量的末尾,以防扩展名被删除。但是,这导致整个变量引用被解释为字符串。

如何使用变量填充BigQueryOperator属性?

1 个答案:

答案 0 :(得分:0)

阅读BigQuery运算符docstring似乎可以以两种方式提供sql语句: 1.作为可以包含模板宏的字符串 2.对可以包含模板宏(文件,而不是文件名)的文件的引用。

无法模板化文件名,只能使用SQL语句。实际上,您的错误消息表明BigQuery无法识别标识符“ example_file”。如果检查运行该查询的项目的BigQuery历史记录,则会看到查询字符串是“ example_file.sql”,它不是有效的SQL语句,因此会出现错误。