將資料表資料匯出至 Cloud Storage
您可以將 BigQuery 資料表資料匯出至 Cloud Storage,格式為 CSV、JSON、Avro 或 Parquet,以便備份、封存或在其他工具中處理。將資料載入 BigQuery 後,您可以使用 Google Cloud 控制台、bq 指令列工具、API、用戶端程式庫或其他匯出方法匯出資料。
匯出限制
當您從 BigQuery 匯出資料時,請注意以下幾點:
- 您無法將資料表資料匯出至本機檔案、Google 試算表或 Google 雲端硬碟。唯一支援的匯出位置是 Cloud Storage。如要瞭解如何儲存查詢結果,請參閱「下載及儲存查詢結果」。
- 最多可將 1 GB 的邏輯資料表資料匯出至單一檔案。如果您匯出的資料超過 1 GB,請使用萬用字元將資料匯出到多個檔案。將資料匯出至多個檔案時,檔案大小會有所不同。如要限制匯出檔案的大小,可以將資料分區,並匯出各個分區。如要進一步瞭解匯出大型資料表的相關資訊和建議,請參閱「大型資料表匯出注意事項」。
- 使用
EXPORT DATA陳述式時,無法保證產生的檔案大小。 - 擷取工作產生的檔案數量可能不盡相同。
- 您無法將巢狀與重複資料匯出成 CSV 格式。Avro、JSON 和 Parquet 匯出作業支援巢狀和重複資料。
- 以 JSON 格式匯出資料時,INT64 (整數) 資料類型會編碼為 JSON 字串,以便在其他系統讀取資料時保留 64 位元精確度。
- 您無法在單一擷取工作中匯出多個資料表的資料。
- 使用 Google Cloud 控制台匯出資料時,只能選擇
GZIP壓縮類型。 - 以 JSON 格式匯出資料表時,系統會使用 Unicode 標記
\uNNNN轉換符號<、>和&,其中N是十六進位數字。舉例來說,profit&loss會變為profit\u0026loss。這項 Unicode 轉換作業是為了避免安全漏洞。 - 除非您使用
EXPORT DATA陳述式,並在query_statement中指定ORDER BY子句,否則無法保證匯出的資料表資料順序。匯出至多個檔案時,所有產生的檔案都會保留排序序列。 - BigQuery 不支援在初始雙斜線後方包含多個連續斜線的 Cloud Storage 資源路徑。Cloud Storage 物件名稱可以包含多個連續斜線 (「/」) 字元。不過,BigQuery 會將多個連續斜線轉換為單一斜線。舉例來說,下列資源路徑雖然在 Cloud Storage 中有效,但在 BigQuery 中無法運作:
gs://bucket/my//object//name。 - 擷取工作執行期間,載入 BigQuery 的任何新資料都不會納入該擷取工作。您必須建立新的擷取工作,才能匯出新資料。
- 在匯出過程中,Cloud Storage 世代編號可能會變更一或多次。如果要在匯出後立即對新的 Cloud Storage 物件執行工作,請勿指定世代編號。
事前準備
授予 Identity and Access Management (IAM) 角色,讓使用者具備執行本文件中各項工作所需的權限。
所需權限
如要執行本文件中的工作,您必須具備下列權限。
從 BigQuery 資料表匯出資料的權限
如要從 BigQuery 資料表匯出資料,您必須具備 bigquery.tables.export IAM 權限。
下列各項預先定義的 IAM 角色都包含 bigquery.tables.export 權限:
roles/bigquery.dataViewerroles/bigquery.dataOwnerroles/bigquery.dataEditorroles/bigquery.admin
執行擷取工作的權限
如要執行擷取工作,您必須具備 bigquery.jobs.create IAM 權限。
下列各項預先定義的 IAM 角色,都包含執行擷取工作所需的權限:
roles/bigquery.userroles/bigquery.jobUserroles/bigquery.admin
將資料寫入 Cloud Storage bucket 的權限
如要將資料寫入現有的 Cloud Storage bucket,您必須具備下列 IAM 權限:
storage.objects.createstorage.objects.delete
下列各項預先定義的 IAM 角色,都包含將資料寫入現有 Cloud Storage bucket 所需的權限:
roles/storage.objectAdminroles/storage.admin
如要進一步瞭解 BigQuery 的 IAM 角色和權限,請參閱「預先定義的角色和權限」。
匯出格式與壓縮類型
BigQuery 支援下列匯出資料用的資料格式與壓縮類型:
| 資料格式 | 支援的壓縮類型 | 說明 |
|---|---|---|
| CSV | GZIP | 您可以使用 不支援巢狀與重複資料。 |
| JSON | GZIP | 支援巢狀和重複資料。 |
| Avro | DEFLATE、SNAPPY | Avro 不支援以 GZIP 格式匯出項目。 支援巢狀和重複資料。請參閱 Avro 匯出詳細資料。 |
| Parquet | SNAPPY、GZIP、ZSTD | 支援巢狀和重複資料。請參閱 Parquet 匯出詳細資料。 |
匯出資料
以下各節將說明如何將資料表資料、資料表中繼資料和查詢結果匯出至 Cloud Storage。
匯出資料表資料
請透過下列方式匯出資料表的資料:
- 使用 Google Cloud 控制台
- 在 bq 指令列工具中使用
bq extract指令 - 使用 API 或用戶端程式庫提交
extract工作
請選取下列其中一個選項:
控制台
在 Google Cloud 控制台開啟「BigQuery」頁面。
點選左側窗格中的 「Explorer」。

如果沒有看到左側窗格,請按一下 「Expand left pane」(展開左側窗格),開啟窗格。
在「Explorer」窗格中展開專案,依序點選「Datasets」(資料集) 和資料集。
依序點選「總覽」>「資料表」,然後選取資料表。
在詳細資料窗格中,依序點選「上傳」圖示 「匯出 / 同步」「Cloud Storage」。
在「Export to Google Storage」(匯出至 Google Cloud Storage) 對話方塊中:
- 在「GCS Location」(GCS 位置),瀏覽要匯出資料的值區、資料夾或檔案。
- 在「Export format」(匯出格式),選擇匯出資料的格式:CSV、JSON (以換行符號分隔)、Avro 或 Parquet。
- 在「Compression」(壓縮) 部分,選取壓縮格式,或選取
None表示不壓縮。
按一下「儲存」即可匯出表格。
如要查看工作進度,請在「Explorer」窗格中點選「Job history」(工作記錄),然後尋找「EXTRACT」類型的工作。
如要將檢視表匯出至 Cloud Storage,請使用 EXPORT DATA OPTIONS 陳述式。
SQL
使用 EXPORT DATA 陳述式。下列範例會從名為 mydataset.table1 的資料表匯出所選欄位:
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中輸入下列陳述式:
EXPORT DATA OPTIONS ( uri = 'gs://bucket/folder/*.csv', format = 'CSV', overwrite = true, header = true, field_delimiter = ';') AS ( SELECT field1, field2 FROM mydataset.table1 ORDER BY field1 );
按一下「 執行」。
如要進一步瞭解如何執行查詢,請參閱「執行互動式查詢」。
bq
使用 bq extract 指令,並加上 --destination_format 旗標。
(選用) 提供 --location 旗標,並將值設為您的位置。
其他選用標記包括:
--compression:匯出檔案所用的壓縮類型。--field_delimiter:匯出作業在採用 CSV 格式的輸出檔案中,用來表示不同資料欄之間界線的字元。\t和tab都可用來表示 Tab 字元分隔。--print_header:如果有指定該旗標,系統在列印有標頭的格式 (例如 CSV) 時,就會列印標頭列。
bq extract --location=location \ --destination_format format \ --compression compression_type \ --field_delimiter delimiter \ --print_header=boolean \ project_id:dataset.table \ gs://bucket/filename.ext
其中:
- location 是您的位置名稱。
--location是選用旗標。舉例來說,如果您在東京地區使用 BigQuery,就可以將旗標的值設為asia-northeast1。您可以使用 .bigqueryrc 檔案設定位置的預設值。 - format 是匯出資料的格式:
CSV、NEWLINE_DELIMITED_JSON、AVRO或PARQUET。 - compression_type 是資料格式支援的壓縮類型。請參閱「匯出格式和壓縮類型」。
- delimiter 是表示 CSV 匯出檔案中資料欄之間界線的字元。
\t和tab都是可接受的 Tab 分隔名稱。 - boolean 為
true或false。設定為true時,如果資料格式支援標頭,系統在列印匯出的資料時就會列印標頭列。預設值為true。 - project_id 是您的專案 ID。
- dataset 是來源資料集的名稱。
- table 是要匯出的資料表。如果使用分區裝飾器,則必須在資料表路徑前後加上單引號,或逸出
$字元。 - bucket 是要匯出資料的 Cloud Storage bucket 名稱。BigQuery 資料集和 Cloud Storage bucket 必須位於相同位置。
- filename.ext 是匯出資料檔案的名稱和副檔名。您可以使用萬用字元,將資料匯出至多個檔案。
範例:
舉例來說,下列指令會把 mydataset.mytable 匯出成名為 myfile.csv 的 gzip 壓縮檔,myfile.csv 儲存在名為 example-bucket 的 Cloud Storage bucket。
bq extract \ --compression GZIP \ 'mydataset.mytable' \ gs://example-bucket/myfile.csv
預設目的地格式為 CSV。如要匯出為 JSON 或 Avro 格式,請使用 destination_format 旗標並將其設為 NEWLINE_DELIMITED_JSON 或 AVRO。例如:
bq extract \ --destination_format NEWLINE_DELIMITED_JSON \ 'mydataset.mytable' \ gs://example-bucket/myfile.json
下列指令會把 mydataset.mytable 匯出成採用 Snappy 壓縮類型的 Avro 格式檔案,檔案名稱為 myfile.avro。myfile.avro 會匯出至名為 example-bucket 的 Cloud Storage bucket。
bq extract \ --destination_format AVRO \ --compression SNAPPY \ 'mydataset.mytable' \ gs://example-bucket/myfile.avro
下列指令會將 mydataset.my_partitioned_table 的單一分區匯出至 Cloud Storage 中的 CSV 檔案:
bq extract \ --destination_format CSV \ 'mydataset.my_partitioned_table$0' \ gs://example-bucket/single_partition.csv
API
如要匯出資料,請建立 extract 工作,並填入工作設定。
(選擇性操作) 在工作資源的 jobReference 區段中,於 location 屬性內指定您的位置。
建立指向 BigQuery 來源資料與 Cloud Storage 目的地的擷取工作。
指定來源資料表,方法是使用包含專案 ID、資料集 ID 和資料表 ID 的
sourceTable設定物件。destination URI(s)屬性必須完整,格式為gs://bucket/filename.ext。每個 URI 都可以包含一個「*」萬用字元,且必須位於 bucket 名稱之後。設定
configuration.extract.destinationFormat屬性以指定資料格式。舉例來說,如要匯出 JSON 檔案,請將此屬性值設為NEWLINE_DELIMITED_JSON。如要檢查工作狀態,請呼叫 jobs.get(job_id),並提供初始要求傳回的工作 ID。
- 如果是
status.state = DONE,代表工作已順利完成。 - 如果出現
status.errorResult屬性,代表要求執行失敗,且該物件將包含所發生錯誤的相關訊息。 - 如果沒有
status.errorResult,表示工作已順利完成,但可能發生一些非致命錯誤。非致命錯誤會列在傳回的工作物件status.errors屬性中。
- 如果是
API 附註:
最佳做法是產生專屬 ID,並在呼叫
jobs.insert建立工作時,將該 ID 做為jobReference.jobId傳遞。這個方法較不受網路故障問題的影響,因為用戶端可對已知的工作 ID 進行輪詢或重試。針對指定的工作 ID 呼叫
jobs.insert算是種冪等運算;換句話說,您可以針對同一個工作 ID 重試作業無數次,但在這些作業中最多只會有一個成功。
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 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
Ruby
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Ruby 設定操作說明進行操作。詳情請參閱 BigQuery Ruby API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
匯出資料表中繼資料
如要從 Iceberg 資料表匯出資料表中繼資料,請使用下列 SQL 陳述式:
EXPORT TABLE METADATA FROM `[[PROJECT_NAME.]DATASET_NAME.]TABLE_NAME`;
更改下列內容:
- PROJECT_NAME:資料表所屬專案的名稱。預設值為執行這項查詢的專案。
- DATASET_NAME:資料表的資料集名稱。
- TABLE_NAME:資料表名稱。
匯出的中繼資料位於 STORAGE_URI/metadata 資料夾,其中 STORAGE_URI 是在選項中設定的資料表儲存位置。
匯出查詢結果
您可以按照下列步驟,在 Google Cloud 控制台中將查詢結果匯出至 Cloud Storage:
在 Google Cloud 控制台開啟「BigQuery」頁面。
按一下「 SQL 查詢」。
在「查詢編輯器」文字區域中,輸入有效的 GoogleSQL 查詢。
按一下「執行」。
傳回結果後,依序點選「儲存結果」>「Cloud Storage」。
在「Export to Google Storage」(匯出至 Google Cloud Storage) 對話方塊中:
- 在「GCS Location」(GCS 位置),瀏覽要匯出資料的值區、資料夾或檔案。
- 在「Export format」(匯出格式),選擇匯出資料的格式:CSV、JSON (以換行符號分隔)、Avro 或 Parquet。
- 在「Compression」(壓縮) 部分,選取壓縮格式,或選取
None表示不壓縮。
按一下「儲存」,匯出查詢結果。
如要查看工作進度,請展開「Job history」(工作記錄) 窗格,然後尋找類型為 EXTRACT 的工作。
其他匯出資料的方式
您也可以使用 EXPORT DATA 陳述式匯出查詢結果。您可以使用 EXPORT DATA OPTIONS 指定匯出資料的格式。
最後,您可以使用 Dataflow 等服務從 BigQuery 讀取資料,而非從 BigLake 匯出資料。如要進一步瞭解如何使用 Dataflow 讀取及寫入 BigQuery,請參閱 BigQuery I/O 說明文件。
Avro 匯出詳細資料
BigQuery 可以透過以下方式表示 Avro 格式的資料:
- 結果匯出檔案是 Avro 容器檔案。
- 每個 BigQuery 資料列都會表示為一筆 Avro 記錄。巢狀資料會以巢狀記錄物件來表示。
REQUIRED欄位會表示為對應 Avro 類型。舉例來說,BigQuery 的INTEGER類型就會對應到 Avro 的LONG類型。NULLABLE欄位會表示為對應類型的 Avro Union 與「空值」。REPEATED欄位會表示為 Avro 陣列。- 在擷取工作和匯出資料 SQL 中,
TIMESTAMP資料類型預設會以timestamp-micros邏輯類型表示 (會為 AvroLONG類型加上註解)。(注意:您可以將use_avro_logical_types=False新增至Export Data Options,停用邏輯類型,改為在時間戳記資料欄使用string類型,但在擷取工作中,一律會使用 Avro 邏輯類型)。 - 在匯出資料 SQL 中,
DATE資料類型預設會以date邏輯類型表示 (會為 AvroINT類型加上註解),但在擷取工作中,預設會以string類型表示。(注意:您可以在Export Data Options中加入use_avro_logical_types=False來停用邏輯類型,或使用--use_avro_logical_types=True旗標在擷取工作中啟用邏輯類型)。 - 在匯出資料 SQL 中,
TIME資料類型預設會以timestamp-micro邏輯類型表示 (會為 AvroLONG類型加上註解),但在擷取工作中,預設會以string類型表示。(注意:您可以將use_avro_logical_types=False新增至Export Data Options來停用邏輯類型,或使用--use_avro_logical_types=True旗標在擷取工作中啟用邏輯類型)。 - 在匯出資料 SQL 中,
DATETIME資料類型預設會以 AvroSTRING類型 (具有自訂命名邏輯類型datetime的字串類型) 表示,但在擷取工作中,預設會以string類型表示。(注意:您可以將use_avro_logical_types=False新增至Export Data Options,停用邏輯類型,或使用--use_avro_logical_types=True旗標,在擷取工作中啟用邏輯類型)。 - Avro 匯出作業不支援 RANGE 類型。
參數化 NUMERIC(P[, S]) 和 BIGNUMERIC(P[, S]) 資料類型會將其有效位數和小數位數類型參數,轉移至 Avro 十進位邏輯類型。
Avro 格式無法與 GZIP 壓縮搭配使用。如要壓縮 Avro 資料,請使用 bq 指令列工具或 API,並指定 Avro 資料支援的壓縮類型:DEFLATE 或 SNAPPY。
Parquet 匯出詳細資料
BigQuery 會將 GoogleSQL 資料類型轉換為下列 Parquet 資料類型:
| BigQuery 資料類型 | Parquet 原始類型 | Parquet 邏輯類型 |
|---|---|---|
| 整數 | INT64 |
NONE |
| 數字 | FIXED_LEN_BYTE_ARRAY |
DECIMAL (precision = 38, scale = 9) |
| Numeric(P[, S]) | FIXED_LEN_BYTE_ARRAY |
DECIMAL (precision = P, scale = S) |
| 大數值 | FIXED_LEN_BYTE_ARRAY |
DECIMAL (precision = 76, scale = 38) |
| BigNumeric(P[, S]) | FIXED_LEN_BYTE_ARRAY |
DECIMAL (precision = P, scale = S) |
| 浮點 | FLOAT |
NONE |
| 布林值 | BOOLEAN |
NONE |
| 字串 | BYTE_ARRAY |
STRING (UTF8) |
| JSON | BYTE_ARRAY |
STRING (UTF8) |
| 位元組數 | BYTE_ARRAY |
NONE |
| 日期 | INT32 |
DATE |
| 日期時間 | INT64 |
TIMESTAMP (isAdjustedToUTC = false, unit = MICROS) |
| 時間 | INT64 |
TIME (isAdjustedToUTC = true, unit = MICROS) |
| 時間戳記 | INT64 |
TIMESTAMP (isAdjustedToUTC = false, unit = MICROS) |
| 地理位置 | BYTE_ARRAY |
GEOGRAPHY (edges = spherical) |
Parquet 結構定義會將巢狀資料表示為群組,並將重複記錄表示為重複群組。如要進一步瞭解如何在 BigQuery 中使用巢狀和重複資料,請參閱「指定巢狀和重複資料欄」。
將 JSON 資料欄匯出為 Parquet 格式時,系統會將其匯出為 STRING 欄位。如要將這個 Parquet 檔案載回 BigQuery 的 JSON 資料欄,您必須在載入工作中指定結構定義 (例如使用 --schema 旗標)。使用 Parquet 自動偵測結構定義時,系統會將資料欄推論為 STRING 類型。
您可以針對 DATETIME 類型使用下列解決方法:
- 將檔案載入暫存資料表。接著使用 SQL 查詢將欄位轉換為
DATETIME,並將結果儲存至新資料表。詳情請參閱「變更資料欄的資料類型」。 - 在載入工作中,使用
--schema旗標提供資料表的結構定義。將日期時間欄定義為col:DATETIME。
GEOGRAPHY 邏輯類型會以新增至匯出檔案的 GeoParquet 中繼資料表示。
將資料匯出為一或多個檔案
destinationUris 屬性會指出 BigQuery 應將檔案匯出至一或多個位置和檔案名稱。
BigQuery 支援在每個 URI 中使用一個萬用字元運算子 (*)。萬用字元可以出現在檔案名稱元件中的任何位置。使用萬用字元運算子就會指示 BigQuery 根據提供的模式建立多個資料分割檔案。萬用字元運算子會以數字取代 (從 0 開始),向左填補到到 12 位數。舉例來說,如果 URI 的檔案名稱結尾有萬用字元,系統會建立檔案,並在第一個檔案附加 000000000000,在第二個檔案附加 000000000001,依此類推。
下表說明 destinationUris 屬性的幾個可能選項:
「destinationUris」選項 |
|
|---|---|
| 單一 URI |
如要匯出的資料表資料不超過 1 GB,請使用單一 URI。這個選項是最常見的使用案例,因為匯出的資料通常小於 1 GB 的上限值。
屬性定義:
建立: gs://my-bucket/file-name.json |
| 單一萬用字元 URI |
萬用字元只能用於 URI 的檔案名稱元件。 如果您認為匯出的資料會超過 1 GB 的上限值,請使用單一萬用字元 URI。BigQuery 會根據您提供的模式,將資料分割為多個檔案。匯出檔案的大小不一。如果查詢包含 `ORDER BY` 子句,系統會將全域排序的結果集依序分配到產生的檔案中。 屬性定義:
建立: gs://my-bucket/file-name-000000000000.json gs://my-bucket/file-name-000000000001.json gs://my-bucket/file-name-000000000002.json ...
建立: gs://my-bucket/000000000000 gs://my-bucket/000000000001 gs://my-bucket/000000000002 ... |
限制匯出檔案大小
單次匯出超過 1 GB 的資料時,必須使用萬用字元將資料匯出至多個檔案,檔案大小不一。如需限制每個匯出檔案的大小上限,可以隨機分割資料,然後將每個分區匯出至檔案:
- 決定所需的分區數量,也就是資料總大小除以所選匯出檔案大小。舉例來說,如果您有 8,000 MB 的資料,且希望每個匯出的檔案約為 20 MB,則需要 400 個分區。
建立新的資料表,並依隨機產生的新資料欄
export_id進行分區和分群。以下範例說明如何從名為source_table的現有資料表建立新的processed_table,該資料表需要n個分區才能達到所選檔案大小:CREATE TABLE my_dataset.processed_table PARTITION BY RANGE_BUCKET(export_id, GENERATE_ARRAY(0, n, 1)) CLUSTER BY export_id AS ( SELECT *, CAST(FLOOR(n*RAND()) AS INT64) AS export_id FROM my_dataset.source_table );
針對介於 0 和
n-1之間的每個整數i,對下列查詢執行EXPORT DATA陳述式:SELECT * EXCEPT(export_id) FROM my_dataset.processed_table WHERE export_id = i;
擷取壓縮表格
Go
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Go 設定操作說明進行操作。詳情請參閱 BigQuery Go API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
Java
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Java 設定操作說明進行操作。詳情請參閱 BigQuery Java API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
Node.js
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Node.js 設定操作說明進行操作。詳情請參閱 BigQuery Node.js API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
Python
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Python 設定操作說明進行操作。詳情請參閱 BigQuery Python API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
用途範例
這個範例說明如何將資料匯出至 Cloud Storage。
假設您持續將端點記錄中的資料串流至 Cloud Storage。每日快照會匯出至 Cloud Storage,用於備份和封存。最佳選擇是擷取工作,但須遵守特定配額和限制。
使用 API 或用戶端程式庫提交擷取工作,並傳入專屬 ID 做為 jobReference.jobId。擷取工作是非同步的。使用建立工作時所用的不重複工作 ID 檢查工作狀態。如果 status.status 為 DONE,代表工作已順利完成。如果出現 status.errorResult,表示工作失敗,需要重試。
批次資料處理
假設您使用夜間批次工作,在固定期限前載入資料。這項載入工作完成後,系統會根據查詢具體化含有統計資料的資料表,如上一節所述。系統會擷取這個資料表中的資料,並彙整成 PDF 報表,然後傳送給監管機構。
由於需要讀取的資料量很小,請使用 tabledata.list API,以 JSON 字典格式擷取資料表的所有資料列。如果資料不只一頁,結果會設定 pageToken 屬性。如要擷取下一頁結果,請再次發出 tabledata.list 呼叫,並將權杖值做為 pageToken 參數。如果 API 呼叫失敗並傳回 5xx 錯誤,請以指數輪詢方式重試。大多數 4xx 錯誤都無法重試。為進一步分離 BigQuery Export 和報表產生作業,應將結果保存至磁碟。
配額政策
如要瞭解擷取工作的配額,請參閱「配額與限制」頁面的「擷取工作」一節。
INFORMATION_SCHEMA提供擷取工作的用量。擷取工作的 JOBS_BY_* 系統資料表中的工作項目包含 total_bytes_processed 值,可用於監控匯總用量,確保用量維持在每天 50 TiB 以下。如要瞭解如何查詢 INFORMATION_SCHEMA.JOBS 檢視表來取得 total_bytes_processed 值,請參閱「INFORMATION_SCHEMA.JOBS 結構定義」
查看目前的配額用量
您可以執行 INFORMATION_SCHEMA 查詢,查看指定時間範圍內執行的工作相關中繼資料,瞭解目前查詢、載入、擷取或複製工作的用量。您可以比較目前用量與配額限制,判斷特定類型工作的配額用量。以下查詢範例使用 INFORMATION_SCHEMA.JOBS 檢視表,依專案列出查詢、載入、擷取和複製工作的數量:
SELECT sum(case when job_type="QUERY" then 1 else 0 end) as QRY_CNT, sum(case when job_type="LOAD" then 1 else 0 end) as LOAD_CNT, sum(case when job_type="EXTRACT" then 1 else 0 end) as EXT_CNT, sum(case when job_type="COPY" then 1 else 0 end) as CPY_CNT FROM `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS_BY_PROJECT WHERE date(creation_time)= CURRENT_DATE()
您可以設定 Cloud Monitoring 警告政策,監控匯出的位元組數。
-
前往 Google Cloud 控制台的 notifications「Alerting」(警告) 頁面:
如果您是使用搜尋列尋找這個頁面,請選取子標題為「Monitoring」的結果。
在「Alerting」(快訊) 頁面中,按一下「Create Policy」(建立政策)。
在「Policy configuration mode」(政策設定模式) 下方,選取「Code editor (MQL or PromQL)」(程式碼編輯器 (MQL 或 PromQL))。
在「PromQL」PromQL查詢編輯器中,輸入下列查詢:
( sum by (project_id, quota_metric, location) (increase({"serviceruntime.googleapis.com/quota/rate/net_usage", monitored_resource="consumer_quota", service="bigquery.googleapis.com"}[1m])) / max by (project_id, quota_metric, location) ({"serviceruntime.googleapis.com/quota/limit", monitored_resource="consumer_quota", service="bigquery.googleapis.com", limit_name="ExtractBytesPerDay"}) ) > 0.01如果未啟用「自動執行」,請點選「執行查詢」。
設定其餘警告,然後點選「建立政策」。
如需建立 PromQL 警告政策的詳細步驟,請參閱「建立 PromQL 警告政策 (控制台)」。
疑難排解
診斷及排解擷取工作的問題。
使用 Logs Explorer 診斷問題
如要診斷擷取工作的問題,您可以使用 Logs Explorer 查看特定擷取工作的記錄,並找出可能發生的錯誤。下列 Logs Explorer 篩選器會傳回擷取工作的相關資訊:
resource.type="bigquery_resource"
protoPayload.methodName="jobservice.insert"
(protoPayload.serviceData.jobInsertRequest.resource.jobConfiguration.query.query=~"EXPORT" OR
protoPayload.serviceData.jobCompletedEvent.eventName="extract_job_completed" OR
protoPayload.serviceData.jobCompletedEvent.job.jobConfiguration.query.query=~"EXPORT")
超出每日擷取位元組配額錯誤
如果擷取作業超出專案預設的每日 50 TiB 上限,BigQuery 就會傳回這項錯誤。如要進一步瞭解擷取工作的限制,請參閱「擷取工作」。
錯誤訊息
Your usage exceeded quota for ExtractBytesPerDay
診斷
如果匯出的資料表大於 50 TiB,匯出作業會因超過擷取限制而失敗。如要匯出特定資料表分區的資料表資料,可以使用分區修飾符,找出要匯出的分區。
如要收集最近幾天的匯出資料用量,可以嘗試下列做法:
查看專案配額:使用
Name: Extract bytes per day或Metric: bigquery.googleapis.com/quota/extract/bytes等篩選條件,並搭配「顯示用量」圖表,查看幾天內的用量趨勢。或者,您也可以查詢
INFORMATION_SCHEMA.JOBS_BY_PROJECT,查看幾天內的擷取位元組總數。舉例來說,下列查詢會傳回過去七天內EXTRACT工作每日處理的總位元組數。SELECT TIMESTAMP_TRUNC(creation_time, DAY) AS day, SUM ( total_bytes_processed ) / POW(1024, 3) AS total_gibibytes_processed FROM `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS_BY_PROJECT WHERE creation_time BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY) AND CURRENT_TIMESTAMP() AND job_type = "EXTRACT" GROUP BY 1 ORDER BY 2 DESC
接著,您可以找出耗用位元組數超出預期的特定工作,進一步縮小結果範圍。以下範例會傳回過去七天內,處理超過 100 GB 的前 100 個
EXTRACT工作。SELECT creation_time, job_id, total_bytes_processed/POW(1024, 3) AS total_gigabytes_processed FROM `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS_BY_PROJECT WHERE creation_time BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY) AND CURRENT_TIMESTAMP() AND job_type="EXTRACT" AND total_bytes_processed > (POW(1024, 3) * 100) ORDER BY total_bytes_processed DESC LIMIT 100
您也可以使用工作探索工具,並搭配 Bytes processed more than 等篩選器,篩選出指定時間範圍內處理量較高的工作。
解析度
如要解決這項配額錯誤,其中一種方法是建立運算單元預留項目,並將專案指派至具有 PIPELINE 工作類型的預留項目。這種方法會使用專屬預留項目,而非免費的共用運算單元集區,因此可以略過限制檢查。如有需要,您可以刪除預留項目,以便日後使用共用運算單元集區。
如要瞭解如何匯出超過 50 TiB 的資料,請參閱「擷取工作」中的附註部分。
巢狀結構定義錯誤,無法匯出
如果嘗試將含有巢狀或重複欄位 (例如 STRUCT 或 ARRAY 資料類型) 的資料表匯出為平面檔案格式 (例如 CSV 或以換行符號分隔的 JSON),就會發生這項錯誤。
錯誤訊息
Failed to export: Operation cannot be performed on a nested schema. Field: [COLUMN_NAME]
發生這項錯誤的原因是 CSV 等平面檔格式無法代表階層式或多值資料。BigQuery 匯出作業需要您先扁平化或轉換這類複雜資料,將其轉換為表格結構,才能以平面檔格式寫入。在這種情況下,COLUMN_NAME 是指含有巢狀或重複欄位的資料欄,必須先扁平化或轉換,才能匯出資料。
解決方式
視來源結構定義而定,您可以透過多種方法簡化結構定義,為匯出作業做好準備。
以下範例顯示含有巢狀 STRUCT 欄位的結構定義,以及將這些欄位扁平化以便匯出的查詢。在範例中,匯出查詢失敗,因為 user_details 欄中有巢狀欄位。您可以按照建議修正方式,將檔案結構簡化為 user_details.name 和 user_details.email 兩欄。
-- Schema example: root ├── id (INTEGER) ├── user_details (RECORD / STRUCT, NULLABLE) │ ├── name (STRING) │ └── email (STRING) └── created_at (TIMESTAMP) -- Export query: SELECT * FROM my_dataset.my_table; -- Suggested fix: SELECT id, user_details.name AS user_name, user_details.email AS user_email, created_at FROM my_dataset.my_table;
以下範例顯示含有重複 ARRAY 欄位的結構定義,以及將這些欄位扁平化以便匯出的查詢。在範例中,匯出查詢失敗的原因是 line_items 欄中有重複欄位。您可以使用建議的修正方式,透過 UNNEST() 運算子將陣列元素轉換為個別資料列。
-- Schema example: root ├── order_id (STRING) ├── customer_name (STRING) └── line_items (REPEATED / ARRAY of RECORD/STRUCT, NULLABLE) ├── product_id (STRING) └── quantity (INTEGER) -- Export query: SELECT * FROM my_dataset.my_orders_table; -- Suggested fix: SELECT t.order_id, t.customer_name, item.product_id, item.quantity FROM my_dataset.my_orders_table AS t LEFT JOIN UNNEST(t.line_items) AS item ;
或者,如果您只需要在 CSV 檔案中將陣列 (例如 ARRAY<STRING>) 表示為單一字串欄,可以使用 ARRAY_TO_STRING()。
ARRAY_TO_STRING() 會將興趣陣列的所有元素串連成單一字串,並以半形逗號分隔。如果每個陣列元素的確切結構對匯出作業不重要,這項轉換就非常實用。
-- Schema example: root ├── user_id (STRING) └── interests (REPEATED / ARRAY of STRING, NULLABLE) -- Suggested fix: SELECT user_id, ARRAY_TO_STRING(interests, ', ') AS user_interests FROM my_dataset.my_users_table;
定價
如要瞭解資料匯出定價,請參閱 BigQuery 定價頁面。
匯出資料之後,系統會因您在 Cloud Storage 中儲存資料而向您收取費用。詳情請參閱 Cloud Storage 定價。
資料表安全性
如要控管 BigQuery 資料表的存取權,請參閱「使用 IAM 控管資源存取權」。
後續步驟
- 如要進一步瞭解 Google Cloud 控制台,請參閱「使用 Google Cloud 控制台」一文。
- 如要進一步瞭解 bq 指令列工具,請參閱「使用 bq 指令列工具」。
- 如要瞭解如何使用 Google BigQuery API 用戶端程式庫來建立應用程式,請參閱用戶端程式庫快速入門導覽課程。