对于参数类型STRING和{ARRAY <string>}(Google BigQuery),运算符IN没有匹配的签名

时间:2017-01-05 19:04:03

标签: ruby google-bigquery

我正在使用Google BigQuery Ruby Client v0.23并尝试使用参数化查询。我正在关注API docs以供参考。

当我在没有参数的情况下运行查询时,一切都很好。然而,为了使它们动态,当我使用数组参数时,我得到错误。例如。当我运行此查询时

bigquery.query("SELECT COUNT(*) FROM oven.sensor_counts WHERE _PARTITIONTIME = TIMESTAMP('2016-04-04') AND sensor_id IN (@sensor_ids)", params: { sensor_ids: ['48-6', '48-2'] })

我明白了

#<Harley::Response POST https://www.googleapis.com/bigquery/v2/projects/sensors-160421/queries == 400 (413 bytes) 3458ms>
Caught error invalidQuery: No matching signature for operator IN for argument types STRING and {ARRAY<STRING>} at [1:116]
Error - #<Google::Apis::ClientError: invalidQuery: No matching signature for operator IN for argument types STRING and {ARRAY<STRING>} at [1:116]>

Google::Cloud::InvalidArgumentError: invalidQuery: No matching signature for operator IN for argument types STRING and {ARRAY<STRING>} at [1:116]
from /usr/local/var/rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/google-cloud-bigquery-0.23.0/lib/google/cloud/bigquery/service.rb:662:in `rescue in execute'

非常感谢任何见解。

2 个答案:

答案 0 :(得分:5)

我认为数组只是一个不正确的参数。根据{{​​3}},语法为:

x IN (y, z, ...)

请注意,没有数组。

用一个字符串替换数组有效:

require "google/cloud/bigquery"

bigquery = Google::Cloud::Bigquery.new

sql = "SELECT word, SUM(word_count) AS word_count " \
      "FROM `bigquery-public-data.samples.shakespeare`" \
      "WHERE word IN (@words) GROUP BY word"
data = bigquery.query sql, params: { words: 'you' }
#=> [{"word"=>"you", "word_count"=>12527}]

根据上面链接的语法指南,数组参数可以添加UNNEST

  

UNNEST表单在FROM子句中处理类似UNNEST的数组扫描:

     

x [NOT] IN UNNEST(<array expression>)

     

此表单通常与ARRAY参数一起使用。例如:

     

x IN UNNEST(@array_parameter)

所以解决方案是:

require "google/cloud/bigquery"

bigquery = Google::Cloud::Bigquery.new

sql = "SELECT word, SUM(word_count) AS word_count " \
      "FROM `bigquery-public-data.samples.shakespeare`" \
      "WHERE word IN UNNEST(@words) GROUP BY word"
data = bigquery.query sql, params: { words: ['me', 'I', 'you'] }
#=> [{"word"=>"I", "word_count"=>21028}, {"word"=>"me", "word_count"=>8030}, {"word"=>"you", "word_count"=>12527}]

答案 1 :(得分:0)

还有一种更好的方法,可以使用数组using parameterized approach

  

从google.cloud导入bigquery

     

client = bigquery.Client()

     

sql =“从烤箱。传感器计数中选择COUNT(*)WHERE _PARTITIONTIME =   TIMESTAMP('2016-04-04')AND sensor_id IN UNNEST(@sensor_ids)“

     

query_params = [       bigquery.ArrayQueryParameter(“ sensor_ids”,“ STRING”,['48 -6','48 -2']),]

     

job_config = bigquery.QueryJobConfig()job_config.query_parameters =   query_params query_job = client.query(       查询,       job_config = job_config,)client.query(sql,job_config = query_config)