BigQuery 异步查询作业 - fetch_results() 方法返回错误数量的值
Posted
技术标签:
【中文标题】BigQuery 异步查询作业 - fetch_results() 方法返回错误数量的值【英文标题】:BigQuery async query job - the fetch_results() method returns wrong number of values 【发布时间】:2017-07-04 01:54:05 【问题描述】:我正在使用 BigQuery 客户端 API 编写 Python 代码,并尝试使用异步查询代码(作为代码示例随处编写),但在 fetch_data() 方法调用时失败。 Python 报错并报错:
ValueError:解包的值太多
因此,3 个返回值(rows、total_count、page_token)似乎是不正确的返回值数量。但是,除了仅显示这 3 个返回结果的众多代码示例之外,我找不到任何关于此方法应该返回什么的文档。
这是一段代码,显示了我在做什么(不包括“客户端”变量的初始化或导入的库,它们在我的代码中较早发生)。
#---> Set up and start the async query job
job_id = str(uuid.uuid4())
job = client.run_async_query(job_id, query)
job.destination = temp_tbl
job.write_disposition = 'WRITE_TRUNCATE'
job.begin()
print 'job started...'
#---> Monitor the job for completion
retry_count = 360
while retry_count > 0 and job.state != 'DONE':
print 'waiting for job to complete...'
retry_count -= 1
time.sleep(1)
job.reload()
if job.state == 'DONE':
print 'job DONE.'
page_token = None
total_count = None
rownum = 0
job_results = job.results()
while True:
# ---- Next line of code errors out...
rows, total_count, page_token = job_results.fetch_data( max_results=10, page_token=page_token )
for row in rows:
rownum += 1
print "Row number %d" % rownum
if page_token is None:
print 'end of batch.'
break
我应该期望从异步查询作业的 job_results.fetch_data(...) 方法调用中得到什么具体的返回结果?
【问题讨论】:
为了调试,如果你打印结果,输出是什么,例如result = job_results.fetch_data(max_results=10, page_token=page_token); print result
?
【参考方案1】:
看来你是对的!代码不再返回这 3 个参数。
正如您在公共存储库中的 commit 中看到的那样,fetch_data 现在返回 HTTPIterator 类的实例(我之前没有意识到这一点,因为我有一个带有旧版本的 docker 映像bigquery 客户端安装在它返回 3 个值的位置)。
我发现返回结果的唯一方法是这样做:
iterator = job_results.fetch_data()
data = []
for page in iterator._page_iter(False):
data.extend([page.next() for i in range(page.num_items)])
请注意,现在我们不必再管理 pageTokens
,它大部分已自动化。
[编辑]:
我刚刚意识到您可以通过以下方式获得结果:
results = list(job_results.fetch_data())
不得不承认现在比以前容易多了!
【讨论】:
哇。感谢您对此进行研究。我以为我对网络上所有关于 3 个结果的示例都快疯了,而没有提到新的 1-result 版本。我今天会尝试这个解决方案。再次感谢您深入研究它,我希望这可以帮助您在升级时避免代码中断。干杯。 你打赌。其实谢谢你提出来。我已经在 Google Cloud Github 上打开了 issue,他们已经在处理这个问题了。 作为后续,文档已更新:github.com/GoogleCloudPlatform/google-cloud-python/blob/master/… 太棒了!再次感谢。以上是关于BigQuery 异步查询作业 - fetch_results() 方法返回错误数量的值的主要内容,如果未能解决你的问题,请参考以下文章
BigQuery 中的查询作业中的 allowLargeResults