分块 BigQuery 结果

Chunking BigQuery results

您好,我正在使用 BigQuery python library,但我在理解 RowIterator class 的工作原理时遇到了一些问题。给定一个查询 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 结果中获取一行结果 table 还是将整个结果存储在内存中。另外,我如何或在哪里指定我想获取固定块大小的结果并获取下一页令牌?

谢谢!

查看 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