对 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的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 查询响应“jobComplete”:错误

查询操作中的 BigQuery 错误:找不到项目 ID

Google BigQuery 内部错误

Google BigQuery 对奇怪尝试的不完整查询回复

BigQuery 可查看的最大内容

BigQuery 试运行会返回啥?