搭配使用分頁功能和 BigQuery API
您可以搭配使用分頁功能和 BigQuery API,有效率地讀取大型資料集的資料表資料和查詢結果。將大型資料集拆分為較小的可管理頁面,有助於最佳化網路用量、將資料放入記憶體,以及手動控制結果流程。對大多數使用者來說,Cloud 用戶端程式庫會自動處理這項程序,但您也可以手動控制特定用途的分頁,例如網頁應用程式。
使用自動分頁
Cloud 用戶端程式庫會處理 API 分頁的低階詳細資料,並提供類似疊代器的體驗。當您疊代結果時,程式庫會在需要時自動擷取下一頁資料。
下列範例示範如何自動疊代 BigQuery 資料表資料。
C#
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 C# 設定操作說明進行操作。詳情請參閱 BigQuery C# API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
Go
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Go 設定操作說明進行操作。詳情請參閱 BigQuery Go API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
Java
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Java 設定操作說明進行操作。詳情請參閱 BigQuery Java API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
Node.js
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Node.js 設定操作說明進行操作。詳情請參閱 BigQuery Node.js API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
PHP
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 PHP 設定操作說明進行操作。詳情請參閱 BigQuery PHP API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
Python
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Python 設定操作說明進行操作。詳情請參閱 BigQuery Python API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
小茹
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Ruby 設定操作說明進行操作。詳情請參閱 BigQuery Ruby API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
控制頁面大小
您可以設定頁面大小,指定每個網路要求傳回的資料列數量上限。設定頁面大小有助於最佳化網路用量,或將資料放入記憶體。
在大多數用戶端程式庫中,呼叫 list_rows 或 query 等方法時,可以使用 max_results 或 page_size 參數。
使用網頁權杖手動分頁
手動分頁適用於無狀態應用程式,例如使用者點選「Next」(下一步) 即可查看下一組結果的網路服務。在這種情況下,伺服器不會在要求之間維護有效的疊代器。
請改用頁面權杖,如下所示:
- 要求網頁。呼叫 API,並接收
pageToken參數和資料列。 - 繼續。在下一個要求中,將相同的
pageToken參數傳回 BigQuery,以擷取下一組資料。
下列範例說明如何擷取頁面權杖,並使用該權杖擷取下一頁的查詢結果。
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 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
使用 ETag 進行最佳化
使用快取的 pageToken 值向後翻頁或跳轉至任意頁面時,頁面中的資料可能自上次查看後有所變更。如要避免這種情況,可以使用 etag 屬性。
每個 collection.list 方法 (Tabledata 除外) 都會在結果中傳回 etag 屬性。這個屬性是頁面結果的雜湊,可用於確認頁面自上一次要求以來是否變更。當您使用 ETag 值向 BigQuery 提出要求時,BigQuery 會比較 ETag 值與 API 傳回的 ETag 值,並根據 ETag 值是否相符做出回應。您可以使用 ETag 避免重複呼叫清單,方法如下:
- 如要僅傳回已變更的值,請使用 HTTP
If-None-Match標頭,透過先前儲存的 ETag 呼叫清單。如果 ETag 相符,BigQuery 會傳回HTTP 304 Not Modified狀態碼,且不傳回任何資料,藉此節省頻寬。 - 如要僅在值「未」變更時傳回值,請使用 HTTP
If-Match標頭。如果網頁有所變更,BigQuery 會傳回412 Precondition Failed。
參考資料:API 限制和條件
在某些情況下,所有 *collection*.list 方法都會傳回分頁結果。maxResults 屬性會限制每頁的結果數量。
| 方法 | 分頁條件 | 預設maxResults限制 |
maxResults上限 |
maxFieldValues上限 |
|---|---|---|---|---|
tabledata.list |
如果回應大小超過 10 MB1 的資料或超過 maxResults 列,則會傳回分頁結果。 |
無限制 | 無限制 | 無限制 |
所有其他 *collection*.list 方法 |
如果回應超過 maxResults 列,且少於上限,則會傳回分頁結果。 |
10,000 | 無限制 | 300,000 |
如果結果超過位元組或欄位限制,系統會修剪結果以符合限制。如果單一資料列超過位元組或欄位限制,tabledata.list 方法最多可傳回 100 MB 的資料1,這與查詢結果的資料列大小上限一致。每頁沒有大小下限,部分頁面傳回的資料列可能比其他頁面多。
jobs.getQueryResults REST API 方法可傳回 20 MB 的資料,除非您透過支援服務明確要求更多資料。
1資料列大小是根據資料列資料的內部表示法計算,因此只是約略值。系統會在查詢工作執行作業的某些階段對資料列大小設定上限。