BigQuery无法准确返回结果

时间:2012-12-06 21:01:54

标签: python google-app-engine google-api google-bigquery

我正在使用GoogleApp Engine,偶尔当我通过JSON API向BigQuery发送查询时,我会得到不正确的结果。它通常仅限于BigQuery中的单个表(我为每个创建的批处理作业创建一个新表)。当我在生产中遇到这个问题时,我记录我提交的Query并尝试通过BigQuery仪表板运行它,该仪表板运行时间超过预期但返回预期结果。

回复中没有任何内容表明存在问题。 jobCompleteTrue的形式返回,但我看不到rows,只有jobReferenceschematotalRows = 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>]}}

无论我尝试在生产中重新运行查询多少次,都会返回相同的结果(这可能是由于通过内存缓存完成缓存而错误的结果被缓存为响应?)

1 个答案:

答案 0 :(得分:1)

问题是以下各项的混合:

  1. 共享的http对象不是线程安全的! (https://developers.google.com/api-client-library/python/guide/thread_safety)。虽然大多数GAE上使用BigQuery的exmap都使用共享的httplib2对象,但这是不正确的用法。只有凭证存储是线程安全的,可以共享
  2. 对BigQuery的查询有超时10秒。
  3. 我正在使用共享的http对象&amp;并行地多次调用BigQuery。任务队列和查询需要10多个才能完成。这就是为什么响应会在调用之间混合,结果不会如预期的那样。例如。 - 我有时会收到对查询请求的发现回复

    修复:

    重新编写我的BigQuery客户端代码,以便在调用之间不共享httplib2对象,并解除我的进程以提交BigQuery作业以运行查询与使用query()调用。在管理呼叫和检查状态以及接收结果方面存在更多的开销,但至少现在可以正常工作并且响应是有意义的。