將資料表資料匯出至 Cloud Storage
您可以將 BigQuery 資料表資料匯出至 Cloud Storage,格式為 CSV、JSON、Avro 或 Parquet,以便備份、封存或在其他工具中處理。將資料載入 BigQuery 後,您可以使用 Cloud de Confiance 控制台、bq 指令列工具、API、用戶端程式庫或其他匯出方法匯出資料。
匯出限制
當您從 BigQuery 匯出資料時,請注意以下幾點:
- 您無法將資料表資料匯出至本機檔案、Google 試算表或 Google 雲端硬碟。唯一支援的匯出位置是 Cloud Storage。如要瞭解如何儲存查詢結果,請參閱「下載及儲存查詢結果」。
- 最多可將 1 GB 的邏輯資料表資料匯出至單一檔案。如果您匯出的資料超過 1 GB,請使用萬用字元將資料匯出到多個檔案。將資料匯出至多個檔案時,檔案大小會有所不同。如要限制匯出檔案的大小,可以將資料分區,並匯出各個分區。如要進一步瞭解匯出大型資料表的相關資訊和建議,請參閱「大型資料表匯出注意事項」。
- 使用
EXPORT DATA陳述式時,無法保證產生的檔案大小。 - 擷取工作產生的檔案數量可能不盡相同。
- 您無法將巢狀與重複資料匯出成 CSV 格式。Avro、JSON 和 Parquet 匯出作業支援巢狀和重複資料。
- 以 JSON 格式匯出資料時,INT64 (整數) 資料類型會編碼為 JSON 字串,以便在其他系統讀取資料時保留 64 位元精確度。
- 您無法在單一擷取工作中匯出多個資料表的資料。
- 使用 Cloud de Confiance 控制台匯出資料時,只能選擇
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。
匯出資料表資料
請透過下列方式匯出資料表的資料:
- 使用 Cloud de Confiance 控制台
- 在 bq 指令列工具中使用
bq extract指令 - 使用 API 或用戶端程式庫提交
extract工作
請選取下列其中一個選項:
控制台
在 Cloud de Confiance 控制台開啟「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 的資料表匯出所選欄位:
前往 Cloud de Confiance 控制台的「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 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
執行程式碼範例前,請將 GOOGLE_CLOUD_UNIVERSE_DOMAIN 環境變數設為 s3nsapis.fr。
Go
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Go 設定操作說明進行操作。詳情請參閱 BigQuery Go API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
執行程式碼範例前,請將 GOOGLE_CLOUD_UNIVERSE_DOMAIN 環境變數設為 s3nsapis.fr。
Java
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Java 設定操作說明進行操作。詳情請參閱 BigQuery Java API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
執行程式碼範例前,請將 GOOGLE_CLOUD_UNIVERSE_DOMAIN 環境變數設為 s3nsapis.fr。
Node.js
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Node.js 設定操作說明進行操作。詳情請參閱 BigQuery Node.js API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
執行程式碼範例前,請將 GOOGLE_CLOUD_UNIVERSE_DOMAIN 環境變數設為 s3nsapis.fr。
PHP
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 PHP 設定操作說明進行操作。詳情請參閱 BigQuery PHP API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
執行程式碼範例前,請將 GOOGLE_CLOUD_UNIVERSE_DOMAIN 環境變數設為 s3nsapis.fr。
Python
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Python 設定操作說明進行操作。詳情請參閱 BigQuery Python API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
執行程式碼範例前,請將 GOOGLE_CLOUD_UNIVERSE_DOMAIN 環境變數設為 s3nsapis.fr。
Ruby
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Ruby 設定操作說明進行操作。詳情請參閱 BigQuery Ruby API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
執行程式碼範例前,請將 GOOGLE_CLOUD_UNIVERSE_DOMAIN 環境變數設為 s3nsapis.fr。
匯出資料表中繼資料
如要從 Iceberg 資料表匯出資料表中繼資料,請使用下列 SQL 陳述式:
EXPORT TABLE METADATA FROM `[[PROJECT_NAME.]DATASET_NAME.]TABLE_NAME`;
更改下列內容:
- PROJECT_NAME:資料表所屬專案的名稱。預設值為執行這項查詢的專案。
- DATASET_NAME:資料表的資料集名稱。
- TABLE_NAME:資料表名稱。
匯出的中繼資料位於 STORAGE_URI/metadata 資料夾,其中 STORAGE_URI 是在選項中設定的資料表儲存位置。
匯出查詢結果
您可以按照下列步驟,在 Cloud de Confiance 控制台中將查詢結果匯出至 Cloud Storage:
在 Cloud de Confiance 控制台開啟「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 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
執行程式碼範例前,請將 GOOGLE_CLOUD_UNIVERSE_DOMAIN 環境變數設為 s3nsapis.fr。
Java
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Java 設定操作說明進行操作。詳情請參閱 BigQuery Java API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
執行程式碼範例前,請將 GOOGLE_CLOUD_UNIVERSE_DOMAIN 環境變數設為 s3nsapis.fr。
Node.js
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Node.js 設定操作說明進行操作。詳情請參閱 BigQuery Node.js API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
執行程式碼範例前,請將 GOOGLE_CLOUD_UNIVERSE_DOMAIN 環境變數設為 s3nsapis.fr。
Python
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Python 設定操作說明進行操作。詳情請參閱 BigQuery Python API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
執行程式碼範例前,請將 GOOGLE_CLOUD_UNIVERSE_DOMAIN 環境變數設為 s3nsapis.fr。
用途範例
這個範例說明如何將資料匯出至 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 警告政策,監控匯出的位元組數。
-
前往 Cloud de Confiance 控制台的 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 控管資源存取權」。
後續步驟
- 如要進一步瞭解 Cloud de Confiance 控制台,請參閱「使用 Cloud de Confiance 控制台」一文。
- 如要進一步瞭解 bq 指令列工具,請參閱「使用 bq 指令列工具」。
- 如要瞭解如何使用 Google BigQuery API 用戶端程式庫來建立應用程式,請參閱用戶端程式庫快速入門導覽課程。