我正在使用GoogleApp Engine,偶尔当我通过JSON API向BigQuery发送查询时,我会得到不正确的结果。它通常仅限于BigQuery中的单个表(我为每个创建的批处理作业创建一个新表)。当我在生产中遇到这个问题时,我记录我提交的Query并尝试通过BigQuery仪表板运行它,该仪表板运行时间超过预期但返回预期结果。
回复中没有任何内容表明存在问题。 jobComplete
以True
的形式返回,但我看不到rows
,只有jobReference
,schema
和totalRows = 0
。
在这种情况下是否适合进行调用以获得作业结果,即使我希望当前的调用返回结果?
相关守则:
http = httplib2.Http(memcache)
self.credentials = AppAssertionCredentials(scope='https://www.googleapis.com/auth/bigquery')
self.http = self.credentials.authorize(http=http)
self.service = build('bigquery','v2',http=self.http)
jobs = self.service.jobs()
result = jobs.query(projectId=settings.GOOGLE_APIS_PROJECT_ID,
body={'query': query}).execute()
响应:
{u'totalRows': u'0', u'kind': u'bigquery#queryResponse', u'jobComplete': True, u'jobReference': {u'projectId': u'<REMOVED>', u'jobId': u'<REMOVED>'}, u'schema': {u'fields': [<REMOVED>]}}
无论我尝试在生产中重新运行查询多少次,都会返回相同的结果(这可能是由于通过内存缓存完成缓存而错误的结果被缓存为响应?)
答案 0 :(得分:1)
问题是以下各项的混合:
我正在使用共享的http对象&amp;并行地多次调用BigQuery。任务队列和查询需要10多个才能完成。这就是为什么响应会在调用之间混合,结果不会如预期的那样。例如。 - 我有时会收到对查询请求的发现回复
修复:
重新编写我的BigQuery客户端代码,以便在调用之间不共享httplib2对象,并解除我的进程以提交BigQuery作业以运行查询与使用query()调用。在管理呼叫和检查状态以及接收结果方面存在更多的开销,但至少现在可以正常工作并且响应是有意义的。