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 过程执行是不是完全同步?

BigQuery 中的查询作业中的 allowLargeResults

在使用计划查询运行 BigQuery 作业之前处理多个条件

现有数据集的 BigQuery API 查询作业返回 404

如何查询在 bigquery 操作中提交的特定作业 ID

如何停止长时间运行的 BigQuery 作业?