本文档介绍如何使用 BigQuery REST API 对表数据和查询结果进行分页。
通过 API 对结果进行分页
在某些情况下,所有 *collection*.list
方法都会返回分页的结果。每页的结果数由 maxResults
属性控制。
方法 | 分页标准 | 默认 maxResults 值 |
最大 maxResults 值 |
最大 maxFieldValues 值 |
---|---|---|---|---|
Tabledata.list |
如果响应大小超过 10 MB 1 数据或超过 maxResults 行,则返回分页结果。 |
10 万 | 无限制 | 无限制 |
所有其他 *collection*.list 方法 |
如果响应超过 maxResults 行并且低于上限,则返回分页结果。 |
1 万 | 无限制 | 300000 |
如果结果大于字节或字段限制,则将对结果进行修剪以满足限制。如果一行超过了字节或字段限制,tabledata.list
最多可返回 100 MB 的数据 1,这与查询结果的最大行大小限制一致。
1行大小是近似的,因为其大小基于行数据的内部表示法。系统会在执行查询作业时的某些阶段实施该限制。
除非通过支持明确请求更多,否则 jobs.getQueryResult
可以返回 20 MB 的数据。
一个页面是总行数的子集。如果结果包含多页数据,则结果数据将具有 pageToken 属性。如需检索下一页结果,请再次调用 list
,并通过网址参数 pageToken 来提供标记值。
用于对表数据进行分页的 tabledata.list 方法使用行偏移值或页面标记。详情请参阅浏览表数据。
以下示例演示了如何对 BigQuery 表数据进行分页。
C#
在尝试此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 C# 设置说明进行操作。如需了解详情,请参阅 BigQuery C# API 参考文档。
Java
试用此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Java 设置说明进行操作。 如需了解详情,请参阅 BigQuery Java API 参考文档。
Go
在尝试此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Go 设置说明进行操作。如需了解详情,请参阅 BigQuery Go API 参考文档。
默认情况下,Go 版 Cloud 客户端库会自动分页,因此您无需自行实现分页,例如:
Node.js
在尝试此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Node.js 设置说明进行操作。如需了解详情,请参阅 BigQuery Node.js API 参考文档。
默认情况下,Node.js 版 Cloud 客户端库会自动分页,因此您无需自行实现分页,例如:
PHP
在尝试此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 PHP 设置说明进行操作。如需了解详情,请参阅 BigQuery PHP API 参考文档。
PHP 版 Cloud 客户端库会通过生成器函数 rows
在迭代期间获取下一页的结果,从而实现自动分页。
Python
在尝试此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Python 设置说明进行操作。如需了解详情,请参阅 BigQuery Python API 参考文档。
默认情况下,Python 版 Cloud 客户端库会自动分页,因此您无需自行实现分页,例如:
Ruby
在尝试此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Ruby 设置说明进行操作。如需了解详情,请参阅 BigQuery Ruby API 参考文档。
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 参考文档。
Node.js
在尝试此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Node.js 设置说明进行操作。如需了解详情,请参阅 BigQuery Node.js API 参考文档。
Python
QueryJob.result
方法会返回查询结果的可迭代对象。或者,
- 读取
QueryJob.destination
属性。如果未配置此属性,则 API 会将此属性设置为对临时匿名表的引用。 - 使用
Client.get_table
方法获取表架构。 - 使用
Client.list_rows
方法创建一个可迭代目标表中的所有行的对象。
在尝试此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Python 设置说明进行操作。如需了解详情,请参阅 BigQuery Python API 参考文档。