对 BigQuery 查询的错误响应:kind:discovery#restDescription 而不是 bigquery#queryResults
Posted
技术标签:
【中文标题】对 BigQuery 查询的错误响应:kind:discovery#restDescription 而不是 bigquery#queryResults【英文标题】:Bad response to a BigQuery query: kind:discovery#restDescription instead of bigquery#queryResults 【发布时间】:2012-11-29 14:37:43 【问题描述】:我从 appengine 中得到了一个我完全没想到的响应。
根据 BigQuery 文档,我得到的不是“bigquery#queryResults”类型的响应,而是
u'basePath': u'/bigquery/v2/', u'kind': u'discovery#restDescription',....
这似乎只发生在需要 10-15 秒及以上的查询上,我怀疑这是与 Appengine 动态 60 秒超时的一些奇怪交互。
我在 python27 上运行,并使用 google-api-python-client 来处理请求。
更新
尝试了其他一些场景:
在后端运行它 - 没有应用程序引擎请求超时 - 同样的事情:大约 9.8 秒的请求返回发现 json
再次在 dev (localhost) 中运行它,确保一切正常
最有趣,以更短的 4 秒超时(与之前的 35 秒相比)运行它会在 之后产生相同的发现回复相同的 9.8s 间隔
【问题讨论】:
您能否向我们展示您的一些代码,也许还有完整的堆栈跟踪?这可能指向 Python 客户端库中的错误。 @JasonHall 你有什么特别感兴趣的吗?最终,它只是一个使用 server2server 凭据的 service.jobs().query(...).execute() 调用,否则效果很好。这发生在 Appengine 上,而不是本地开发服务器上。我不确定您指的是哪个堆栈跟踪 - 我得到的不是异常,而是从调用中返回的。discovery#restDescription
来自 Discovery API,当您调用 build()
时 Python 客户端会使用它来生成能够调用 BigQuery API 的方法。因此,听起来您收到的响应来自 Discovery API 调用,而不是 BigQuery。
我自己想出了这么多。问题是为什么这个响应而不是我正在使用的 API 记录的响应,如果它指示错误,那么错误是什么?
【参考方案1】:
来自 App Engine quota docs:
Each incoming HTTP request can be no larger than 32MB.
您的查询返回的数据可能超过 32 MB,这会导致 HTTP 500 错误,从而导致 API 提供您在上面看到的输出(即 BigQuery API Discovery 文档信息 - 此响应可能是与 Python 客户端库如何处理 App Engine 上的错误响应的单独问题有关)。
建议的解决方法:如果您的查询响应返回大量数据,您可以使用maxResults 参数将响应页面中返回的行数限制为较小的数量。然后,您可以对 API 进行连续调用以检索后续数据页。
【讨论】:
响应很小 - 它们的大小与流程数据的大小无关。【参考方案2】:这是底层 httplib2 库中已知且已修复的错误。
确保您使用的是 0.8 或更高版本:
检查httplib2/__init__.py:
__version__ = "0.8"
【讨论】:
以上是关于对 BigQuery 查询的错误响应:kind:discovery#restDescription 而不是 bigquery#queryResults的主要内容,如果未能解决你的问题,请参考以下文章