【问题标题】:Bad Request error while querying data from bigquery in a loop在循环中从 bigquery 查询数据时出现错误的请求错误
【发布时间】:2018-06-13 13:30:08
【问题描述】:

我正在循环使用下面提到的 get_data_from_bq 方法从 bigquery 查询数据:

def get_data_from_bq(product_ids):
    format_strings = ','.join([("\"" + str(_id) + "\"") for _id in product_ids])
    query = "select productId, eventType, count(*) as count from [xyz:xyz.abc] where productId in (" + format_strings + ") and eventTime > CAST(\"" + time_thresh +"\" as DATETIME) group by eventType, productId order by productId;"
    query_job = bigquery_client.query(query, job_config=job_config)
    return query_job.result()

虽然返回的第一个查询(迭代)数据是正确的,但所有后续查询都抛出下面提到的异常

    results = query_job.result()
  File "/home/ishank/.local/lib/python2.7/site-packages/google/cloud/bigquery/job.py", line 2415, in result
    super(QueryJob, self).result(timeout=timeout)
  File "/home/ishank/.local/lib/python2.7/site-packages/google/cloud/bigquery/job.py", line 660, in result
    return super(_AsyncJob, self).result(timeout=timeout)
  File "/home/ishank/.local/lib/python2.7/site-packages/google/api_core/future/polling.py", line 120, in result
    raise self._exception
google.api_core.exceptions.BadRequest: 400 Cannot explicitly modify anonymous table xyz:_bf4dfedaed165b3ee62d8a9efa.anon1db6c519_b4ff_dbc67c17659f

编辑 1: 下面是一个引发上述异常的示例查询。此外,这在 bigquery 控制台中运行顺利。

select productId, eventType, count(*) as count from [xyz:xyz.abc] where productId in ("168561","175936","161684","161681","161686") and eventTime > CAST("2018-05-30 11:21:19" as DATETIME) group by eventType, productId order by productId;

【问题讨论】:

    标签: python google-bigquery


    【解决方案1】:

    我遇到了完全相同的问题。问题不在于查询本身,而在于您很可能重用了相同的QueryJobConfig。当您执行查询时,除非您设置 destination,否则 BigQuery 会将结果存储在一个匿名表中,该表在 QueryJobConfig 对象中声明。如果您重复使用此配置,BigQuery 会尝试将新结果存储在同一个匿名表中,因此会出现错误。 老实说,我不是特别喜欢这种行为。

    你应该这样重写你的代码:

    def get_data_from_bq(product_ids):
        format_strings = ','.join([("\"" + str(_id) + "\"") for _id in product_ids])
        query = "select productId, eventType, count(*) as count from [xyz:xyz.abc] where productId in (" + format_strings + ") and eventTime > CAST(\"" + time_thresh +"\" as DATETIME) group by eventType, productId order by productId;"
        query_job = bigquery_client.query(query, job_config=QueryJobConfig())
        return query_job.result()
    

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      已编辑:

      Federico Bertola 在解决方案和 BigQuery see this link 写入的临时表上是正确的。

      我上次从公共表查询示例代码时没有收到错误,但我今天可以重现该错误,因此此症状可能会出现间歇性。根据 Federico 的建议,我可以确认错误已得到解决。


      当查询字符串在查询中的参数周围缺少引号时,您可能会收到“super(QueryJob, self).result(timeout=timeout)”错误。您的查询中的参数 format_strings 似乎也犯了类似的错误。您可以通过确保参数周围有引号转义来解决此问题:

      (" + myparam + ")
      

      ,应该写成

      (\"" + myparam + "\")
      

      您应该检查使用参数的查询字符串,并从更简单的查询开始,例如

      select productId, eventType, count(*) as count from `xyz:xyz.abc`
      

      ,并随着你的发展增加你的查询。

      为了记录,这对我有用:

      from google.cloud import bigquery
      client = bigquery.Client()
      job_config = bigquery.QueryJobConfig()
      
      def get_data_from_bq(myparam):  
          query = "SELECT word, SUM(word_count) as count FROM `publicdata.samples.shakespeare` WHERE word IN (\""+myparam+"\") GROUP BY word;"
          query_job = client.query(query, job_config=job_config) 
          return query_job.result()
      
      mypar = "raisin"
      x = 1
      while (x<9):
          iterator = get_data_from_bq(mypar)
          print "==%d iteration==" % x
          x += 1
      

      【讨论】:

      • 请考虑使用正确的query parameters,而不是修改查询文本:)
      • 我在创建 format_strings 时添加了带有转义字符的引号。也试过你的解决方法,还是不行。我添加了一个引发此错误的示例查询。
      • 也尝试了您的示例代码。它在第二次迭代时抛出了同样的异常。
      • 正如 Elliott 指出的,建议使用查询参数。您可以将其与标准 SQL 语法一起使用。您提到您尝试从公共表中查询我的示例代码,但它引发了相同的异常。我怀疑你的设置有问题。在您的错误文本中,我看到“匿名表 xyz”,但在您的查询中,您的表名为“abc”而不是“xyz”。确认您在 BigQuery 中的数据集“xyz”下有表“abc”,并在您的方法中运行更简单的查询以确认您的设置正常:query = """select productId, eventType, count(*) as count from @ 987654327@;"""
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-16
      • 1970-01-01
      • 1970-01-01
      • 2020-12-30
      • 1970-01-01
      相关资源
      最近更新 更多