使用分页功能通过 BigQuery API 读取数据
本文档介绍如何使用分页功能通过 BigQuery API 读取表数据和查询结果。
使用 API 对结果进行分页
在某些情况下,所有 *collection*.list 方法都会返回分页的结果。maxResults 属性限制每页的结果数。
| 方法 | 分页标准 | 默认 maxResults 值 |
最大 maxResults 值 |
最大 maxFieldValues 值 |
|---|---|---|---|---|
tabledata.list |
如果响应大小超过 10 MB 1 数据或超过 maxResults 行,则返回分页结果。 |
无限制 | 无限制 | 无限制 |
所有其他 *collection*.list 方法 |
如果响应超过 maxResults 行并且低于上限,则返回分页的结果。 |
10000 | 无限制 | 300000 |
如果结果大于字节或字段限制,则将对结果进行修剪以满足限制。如果一行超过了字节或字段限制,tabledata.list 最多可返回 100 MB 的数据 1,这与查询结果的最大行大小限制一致。
每页没有最小大小,而某些页面返回的行数可能多于其他页面。
1行大小是近似的,因为其大小基于行数据的内部表示法。系统会在执行查询作业时的某些阶段实施该限制。
除非通过支持明确请求更多,否则 jobs.getQueryResults 可以返回 20 MB 的数据。
一个页面是总行数的子集。如果结果包含多页数据,则结果数据将具有 pageToken 属性。如需检索下一页结果,请再次调用 list,并以网址参数 pageToken 的形式添加标记值。
用于对表数据进行分页的 tabledata.list 方法使用行偏移值或页面标记。详情请参阅浏览表数据。
遍历客户端库结果
云客户端库可处理 API 分页的低层细节,并提供更类似迭代器的体验,可简化与页面响应中各个元素的交互。
以下示例演示了如何对 BigQuery 表数据进行分页。
C#
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 C# 设置说明进行操作。 如需了解详情,请参阅 BigQuery C# API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
Java
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。 如需了解详情,请参阅 BigQuery Java API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
Go
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Go 设置说明进行操作。 如需了解详情,请参阅 BigQuery Go API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
默认情况下,Go 版 Cloud 客户端库会自动分页,因此您无需自行实现分页,例如:
Node.js
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 BigQuery Node.js API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
默认情况下,Node.js 版 Cloud 客户端库会自动分页,因此您无需自行实现分页,例如:
PHP
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 PHP 设置说明进行操作。 如需了解详情,请参阅 BigQuery PHP API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
PHP 版 Cloud 客户端库会通过生成器函数 rows 在迭代期间获取下一页的结果,从而实现自动分页。
Python
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Python 设置说明进行操作。 如需了解详情,请参阅 BigQuery Python API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
默认情况下,Python 版 Cloud 客户端库会自动分页,因此您无需自行实现分页,例如:
Ruby
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Ruby 设置说明进行操作。 如需了解详情,请参阅 BigQuery Ruby API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
Ruby 版 Cloud 客户端库中会使用 Table#data 和 Data#next 自动分页。
请求任意页面并避免冗余列表调用
当您使用缓存的 pageToken 值向后翻页或跳转到任意页面时,页面中的数据可能自上次查看后已更改,但没有数据可能已更改的明确指示。您可以使用 etag 属性缓解此问题。
每个 collection.list 方法(Tabledata 除外)都会在结果中返回 etag 属性。该属性是页面结果的哈希值,可用于验证自上次请求以来页面是否已更改。当使用 ETag 值向 BigQuery 发出请求时,BigQuery 会将 ETag 值与 API 返回的 ETag 值进行比较,并根据两个 ETag 值是否匹配做出响应。您可以使用 ETag 来避免冗余列表调用,如下所示:
在值已更改时返回列表值。
如果您只想在值已更改时返回列表值页面,则可以通过 HTTP“if-none-match”标头使用先前存储的 ETag 进行列表调用。如果您提供的 ETag 与服务器上的 ETag 不匹配,BigQuery 将返回一页新列表值。如果 ETag 匹配,则 BigQuery 会返回
HTTP 304 Not Modified状态代码,而不返回任何值。例如,用户可能会定期在一个网页中填写信息,该信息存储在 BigQuery 中。如果数据未更改,您可以通过使用 if-none-match 标头和 ETag 来避免对 BigQuery 进行冗余列表调用。在值未更改时返回列表值。
如果您只想在值未更改时返回列表值页面,可以使用 HTTP“if-match”标头。如果结果未更改,则 BigQuery 会匹配 ETag 值并返回结果页面;如果该页面已更改,则返回 412“Precondition Failed”结果。
对查询结果进行分页
每个查询都会写入目标表。如果未提供目标表,BigQuery API 会引用临时匿名表以自动填充目标表属性。
API
读取 jobs.config.query.destinationTable 字段以确定已写入查询结果的表。
调用 tabledata.list 以读取查询结果。
Java
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。 如需了解详情,请参阅 BigQuery Java API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
如需设置每个页面上返回的行数,请使用 GetQueryResults 作业,并设置您传入的 QueryResultsOption 对象的 pageSize 选项,如以下示例所示:
TableResult result = job.getQueryResults();
QueryResultsOption queryResultsOption = QueryResultsOption.pageSize(20);
TableResult result = job.getQueryResults(queryResultsOption);
Node.js
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 BigQuery Node.js API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
Python
QueryJob.result 方法会返回查询结果的可迭代对象。或者,
- 读取
QueryJob.destination属性。如果未配置此属性,则 API 会将此属性设置为对临时匿名表的引用。 - 使用
Client.get_table方法获取表架构。 - 使用
Client.list_rows方法创建一个可迭代目标表中的所有行的对象。
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Python 设置说明进行操作。 如需了解详情,请参阅 BigQuery Python API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。