BigQuery异步查询作业-fetch_results()方法返回错误数量的值


问题内容

我正在使用BigQuery Client
API编写Python代码,并尝试使用异步查询代码(作为代码示例在各处编写),并且在fetch_data()方法调用中失败。Python错误并出现以下错误:

ValueError:太多值无法解包

因此,三个返回值(行,total_count,page_token)似乎是错误的返回值数。但是,除了众多仅显示这3个返回结果的代码示例外,我找不到有关此方法应返回什么的任何文档。

这是显示我在做什么的代码片段(不包括“ client”变量或导入的库的初始化,这在我的代码中更早发生)。

#---> 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(…)方法调用中得到什么具体的返回结果?


问题答案:

看起来您是对的!该代码不再返回这3个参数。

如您在公共存储库中的提交中所看到的那样,fetch_data现在返回HTTPIterator类的实例(猜测我之前没有意识到这一点,因为我安装了安装了bigquery客户端的较旧版本的docker映像,该映像确实返回了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())

不得不承认现在比以前更容易了!