BigQuery 未准确返回结果
Posted
技术标签:
【中文标题】BigQuery 未准确返回结果【英文标题】:BigQuery not accurately returning results 【发布时间】:2012-12-06 21:01:53 【问题描述】:我使用的是 GoogleApp Engine,有时当我通过 JSON API 向 BigQuery 发送查询时,我会得到不正确的结果。它通常仅限于 BigQuery 中的一个表(我为每个创建的批处理作业创建一个新表)。当我在生产中遇到这个问题时,我记录了我提交的查询并尝试通过 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>]
无论我尝试在生产环境中重新运行多少次查询,都会返回相同的结果(这可能是由于通过 memcache 完成的缓存将不正确的结果缓存为响应?)
【问题讨论】:
您可以发送您认为有错误响应的工作的 jobid 吗? job_3729b36aa04148bbbb9625a1b4ce6190 如果您不想在公共论坛上讨论查询详细信息,可以在 google.com 上用我的姓给我发电子邮件吗? (我的初步调查使查询看起来返回了正确的数据,但我想更好地了解您认为正确的结果是什么,以及针对此表的其他查询是否按预期工作) 我已经通过电子邮件向您发送了更多信息。 【参考方案1】:问题是以下几种情况的混合:
-
共享的 http 对象不是线程安全的! (https://developers.google.com/api-client-library/python/guide/thread_safety)。尽管 GAE 上使用 BigQuery 的大多数示例都使用共享的 httplib2 对象,但这是不正确的用法。只有凭证存储是线程安全的并且可以共享
BigQuery 上的查询超时 10 秒。
我正在使用共享的 http 对象和任务队列并行多次调用 BigQuery,并且查询需要 10 多秒才能完成。这就是为什么响应会在呼叫之间混合,结果不会像预期的那样。例如。 - 我有时会收到对我的查询请求的发现响应
解决方法:
重新编写我的 BigQuery 客户端代码,以便在调用之间不共享 httplib2 对象,并将我的流程解耦以提交 BigQuery 作业以运行查询,而不是使用 query() 调用。管理调用、检查状态和接收结果的开销要大得多,但至少它现在可以工作并且响应是有意义的。
【讨论】:
以上是关于BigQuery 未准确返回结果的主要内容,如果未能解决你的问题,请参考以下文章