【问题标题】:No matching signature for operator IN for argument types STRING and {ARRAY<STRING>} (Google BigQuery)参数类型 STRING 和 {ARRAY<STRING>} (Google BigQuery) 的运算符 IN 没有匹配的签名
【发布时间】:2017-05-20 10:49:21
【问题描述】:

我正在使用 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'

任何见解都将不胜感激。

【问题讨论】:

标签: ruby google-bigquery


【解决方案1】:

我相信数组只是一个不正确的参数。根据Functions & Operators,语法为:

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(&lt;array expression&gt;)

这种形式通常与 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}]

【讨论】:

  • 你救了我的命! =)
  • UNNEST 为我解决了字符串数组的类似问题,但我未能使用 Date[] 完成它。您不知道 Dates 的任何解决方法吗?
【解决方案2】:

使用数组有更好的方法,using parameterized approach

从 google.cloud 导入 bigquery

client = bigquery.Client()

sql = "从烤箱.sensor_counts WHERE _PARTITIONTIME = 中选择 COUNT(*) 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)

【讨论】:

    猜你喜欢
    • 2019-09-20
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 2019-02-07
    • 2021-07-02
    相关资源
    最近更新 更多