Chunking BigQuery结果

时间:2018-02-15 05:30:04

标签: google-bigquery chunking

您好我正在使用BigQuery python library,而我在理解RowIterator类的工作原理时遇到了一些麻烦。给定查询job_id我想以固定大小的块来获取结果行。

我首先使用客户端运行查询。

query_job = client.query(query, job_config=job_config)

后来我拿这样的工作 -

job = client.get_job(query_job.job_id)
result_iter = job.result()

我想知道job.result()如何获得结果。它是从bigquery结果表一次一行地获取结果还是将整个结果存储在内存中。另外,我如何或在何处指定我想在固定的chunksize中获取结果并获取下一页令牌?

谢谢!

1 个答案:

答案 0 :(得分:0)

查看RowTerator代码,它将尝试使用一个GET请求读取所有结果,然后在内存中迭代它们。

无法在job.result()中设置max_results,因此它将受到BigQuery默认限制100.000行[1]和10MB总大小的限制。如果结果不符合此限制,迭代器将尝试阅读下一页。

list_rows API [2]允许您设置max_results和page_token。如果您的目标是以定义大小的页面读取所有作业结果,则可以使用此API为每个页面创建单独的RowTerator。您可以从迭代器[3]获取下一页令牌。希望这会有所帮助。

[1] https://cloud.google.com/bigquery/docs/paging-results

[2] https://github.com/GoogleCloudPlatform/google-cloud-python/blob/16b0f8eb9adacf47127521f93c13380a332268b1/bigquery/google/cloud/bigquery/client.py#L1218

[3] https://github.com/GoogleCloudPlatform/google-cloud-python/blob/b0dc7bc17d8bb3ab56928f28096846c55cb79893/api_core/google/api_core/page_iterator.py#L340