使用分页功能通过 BigQuery API 读取数据
本文档介绍如何使用分页功能通过 BigQuery API 读取表数据和查询结果。
使用 API 对结果进行分页
在某些情况下,所有 *collection*.list
方法都会返回分页的结果。maxResults
属性限制每页的结果数。
方法 | 分页标准 | 默认 maxResults 值 |
最大 maxResults 值 |
最大 maxFieldValues 值 |
---|---|---|---|---|
tabledata.list |
如果响应大小超过 10 MB 1 数据或超过 maxResults 行,则返回分页结果。 |
无限制 | 无限制 | 无限制 |
所有其他 *collection*.list 方法 |
如果响应超过 maxResults 行并且低于上限,则返回分页的结果。 |
1 万 | 无限制 | 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 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
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 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。