2012-12-06 66 views
1

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

响应中没有任何内容表示问题。 jobComplete返回为True,但我看不到rows,只有jobReference,schematotalRows = 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>]}} 

不管我尝试多少次重新运行在生产中,同样的结果返回的查询(难道这是由于通过memcache完成缓存并将不正确的结果缓存为响应?)

+0

您能否发送您认为回复不正确的工作的jobid? –

+0

job_3729b36aa04148bbbb9625a1b4ce6190 – someone1

+2

如果您不想在公开论坛上讨论查询详情,您可以通过我的姓氏在google.com上发电子邮件给我吗? (我最初的调查使它看起来像查询返回正确的数据,但我想更好地理解你认为正确的结果将是什么,以及针对此表的其他查询是否按预期工作) –

回答

1

该问题是以下内容的混合:

  1. 共享http对象不是线程安全! (https://developers.google.com/api-client-library/python/guide/thread_safety)。尽管在GAE上使用BigQuery的大多数例子都使用共享的httplib2对象,但这是不正确的用法。只有凭证存储是线程安全的并且可以共享
  2. BigQuery上的查询有10秒超时。

我正在使用共享http对象并行地对BigQuery进行多个调用&任务队列和查询需要花费10多秒才能完成。这就是为什么响应会在呼叫间混合,结果不会如预期那样。例如。 - 我有时收到的发现响应我的查询请求

解决方法:

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