如何使用bigquery运算符将查询参数传递到sql文件

ganesh_patil

我需要访问sql文件中BigqueryOperator传递的参数,但是ERROR - queryParameters argument must have a type <class 'dict'> not <class 'list'>我在使用以下代码时遇到错误

t2 = bigquery_operator.BigQueryOperator(
task_id='bq_from_source_to_clean',
sql='prepare.sql',
use_legacy_sql=False,
allow_large_results=True,
query_params=[{ 'name': 'threshold_date', 'parameterType': { 'type': 'STRING' },'parameterValue': { 'value': '2020-01-01' } }],
destination_dataset_table="{}.{}.{}".format('xxxx',
                                            'xxxx',
                                            'temp_airflow_test'),
create_disposition="CREATE_IF_NEEDED",
write_disposition="WRITE_TRUNCATE",
dag=dag

SQL:

select  cast(DATE_ADD(a.dt_2, interval 7 day) as DATE) as dt_1
,a.dt_2
,cast('2010-01-01' as DATE) as dt_3 
from (select cast(@threshold_date as date) as dt_2) a

我正在使用Google composer版本composer-1.7.0-airflow-1.10.2

提前致谢。

诺比

深入研究源代码后,似乎BigQueryHook在Airflow 1.10.3中修复了一个错误。

您定义的方式query_params对于较新版本的Airflow是正确的,并且应该是根据BigQuery API列出的清单:请参见https://cloud.google.com/bigquery/docs/parameterized-queries#bigquery_query_params_named-python

无论如何,您都会收到此错误,因为在Airflow 1.10.2中,该错误query_params定义为dict,请参见:

https://github.com/apache/airflow/blob/1.10.2/airflow/contrib/hooks/bigquery_hook.py#L678

query_param_list = [
    ...
    (query_params, 'queryParameters', None, dict),
    ...
]

这导致内部_validate_value函数抛出TypeError

https://github.com/apache/airflow/blob/1.10.2/airflow/contrib/hooks/bigquery_hook.py#L1954

def _validate_value(key, value, expected_type):
    """ function to check expected type and raise
    error if type is not correct """
    if not isinstance(value, expected_type):
        raise TypeError("{} argument must have a type {} not {}".format(
            key, expected_type, type(value)))

我没有query_params在Airflow 1.10.2中找到任何示例(或任何单元测试...),但是我认为这仅仅是因为它不可用。

这些错误已通过以下提交修复:

这些更改已嵌入到Airflow 1.10.3中,但是到目前为止,Composer中不提供Airflow 1.10.3(https://cloud.google.com/composer/docs/concepts/versioning/composer-versions#new_environments):最新版本已于2019年5月16日发布并嵌入版本1.10.2。

等待这个新版本,我看到2种方法来解决您的问题:

  • 复制/粘贴和的固定版本,BigQueryOperator然后BigQueryHook将其嵌入您的源中以使用它们,或者扩展现有的BigQueryHook方法并覆盖错误的方法。我不确定您可以BigQueryHook直接打补丁(在Composer环境中无法访问这些文件)
  • 自己对SQL查询进行模板化(而不使用query_params

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Mule Sql查询-将参数传递给IN运算符

将C#中的查询参数作为参数传递给BigQuery中的IN运算符的正确方法

如何将运算符作为参数传递

使用。&运算符将参数传递给静态方法

如何使用Airflow的BigQuery运算符引用外部SQL文件?

如何使用LIKE运算符编写SQL查询

修改BigQuery运算符以显式传递JobId参数AirFlow运算符

如何使用类似的运算符在neo4j Cypher查询中传递动态参数

将数组绑定到占位符后,wpdb不使用IN运算符执行查询

使用C#中的参数化查询在SQL中为IN运算符发送参数

使用参数运算符的MySQL参数化查询

有什么方法可以将运算符 <、<>、>= 传递到 sql-query 中?

Kotlin:将运算符作为函数参数传递

将多个参数传递给流运算符

将数学运算符作为参数传递

perl6将运算符作为参数传递

scala,将运算符作为函数的参数传递

如何将文本参数传递给IN运算符的存储函数

如何将额外的参数传递给RxJS映射运算符

如何将省略号运算符得到的参数传递给其他函数?

使用TypeScript将数组传递给扩展运算符参数

R,在使用订单函数时将无效参数传递给一元运算符

从laravel将整数数组传递到mssql sp中,以在“ in”运算符中使用

查询 SQL AND 运算符

如何传递重定向运算符'>'作为execv的参数?

如何在Ruby中将运算符作为参数传递?

如何传递动态参数Airflow运算符?

如何将 SQL 查询转换为 PHP 并在 WHERE 子句中使用 AND 运算符

在ASP MVC中使用隐式运算符将字符串绑定到参数