我正在谷歌应用引擎中从我的应用对 BigQuery 进行查询,有时会从 BQ 收到奇怪的结果(发现#restDescription)。我花了一些时间才明白只有当我查询的数据量很大时才会出现问题,从而使我的查询在 10 秒内超时。
我在这里找到了对我的问题的一个很好的描述: Bad response to a BigQuery query
再次阅读 GAE 文档后,我发现应该在几秒钟内处理 HTTP 请求。所以我想,这只是一个猜测,bigquery 也可能以同样的方式限制自己,因此,必须“在几秒钟内”响应我的查询。
如果是这种情况,首先,我会有点惊讶,因为我的 bigquery 请求肯定会花费几秒钟以上......但无论如何,我通过强制我的 1 秒超时进行了测试查询,然后通过轮询 API 调用 getQueryResults 来获取 queryResult。
结果非常有趣。BigQuery 在 3 秒内或多或少地返回一些东西(不是我问的 1),然后我稍后会在 26 秒内通过轮询获得结果。这看起来像是规避了 10 秒超时问题。
但我几乎看不到自己在生产中做这个把戏。
有人遇到过与 BigQuery 相同的问题吗?当查询持续时间超过“几秒钟”时,我应该怎么做?
这是我用来查询的代码:
query_config = {
'timeoutMs': 1000,
"defaultDataset": {
"datasetId": self.dataset,
"projectId": self.project_id
},
}
query_config.update(params)
result_json = (self.service.jobs()
.query(projectId=project,
body=query_config)
.execute())
为了检索结果,我用这个进行投票:
self.service.jobs().getQueryResults(projectId=project,jobId=jobId).execute()
这些是 BigQuery 上发生的事情的日志:
2012-12-03 12:31:19.835 /api/xxxxx/ 200 4278ms 0kb Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1
xx.xx.xx.xx - - [03/Dec/2012:02:31:19 -0800] "GET /api/xxxxx/ HTTP/1.1" 200 243 ....... ms=4278 cpu_ms=346 cpm_usd=0.000426 instance=00c61b117c1169753678c6d5dac736b223809b
I 2012-12-03 12:31:16.060
URL being requested: https://www.googleapis.com/discovery/v1/apis/bigquery/v2/rest?userIp=xx.xx.xx.xx
I 2012-12-03 12:31:16.061
Attempting refresh to obtain initial access_token
I 2012-12-03 12:31:16.252
URL being requested: https://www.googleapis.com/bigquery/v2/projects/xxxxxxxxxxxx/queries?alt=json
I 2012-12-03 12:31:19.426
URL being requested: https://www.googleapis.com/bigquery/v2/projects/xxxxxxxx/jobs/job_a1e74a6769f74cb997d998623b1b6b2e?alt=json
I 2012-12-03 12:31:19.500
这是我的查询 API 调用返回给我的。在元数据中,状态为“正在运行”:
{u'kind': u'bigquery#queryResponse', u'jobComplete': False, u'jobReference': {u'projectId': u'xxxxxxxxxxx', u'jobId': u'job_a1e74a6769f74cb997d998623b1b6b2e'}}
使用 jobId,我可以在 26 秒后检索结果,当它们准备好时。
一定有别的办法!我究竟做错了什么?