使用跨雲端作業載入資料
身為 BigQuery 管理員或分析師,您可以將 Amazon Simple Storage Service (Amazon S3) 值區或 Azure Blob 儲存體中的資料載入至 BigQuery 資料表。您可以將轉移的資料與Google Cloud 區域中的資料彙整,也可以利用 BigQuery ML 等 BigQuery 功能。
您可以透過以下方式將資料移轉至 BigQuery:
使用
LOAD DATA
陳述式,將 Amazon S3 和 Azure Blob Storage 中的檔案資料轉移至 BigQuery 資料表。使用
CREATE TABLE AS SELECT
陳述式,先從 Amazon S3 或 Blob Storage 中的檔案篩選資料,再將結果轉移至 BigQuery 資料表。如要將資料附加至目的地資料表,請使用INSERT INTO SELECT
陳述式。資料操控會套用至參照 Amazon S3 或 Blob Storage 資料的外部資料表。
配額與限制
如要瞭解配額和限制,請參閱「查詢工作配額和限制」。
定價
您會因使用 LOAD
陳述句在各雲端間傳輸的位元組數而產生費用。如需定價資訊,請參閱 BigQuery Omni 定價中的「Omni 跨雲資料移轉」一節。
您會因使用 CREATE TABLE AS SELECT
陳述式或 INSERT INTO SELECT
陳述式,以及運算能力,而為跨雲端傳輸的位元組和運算能力付費。
LOAD
和 CREATE TABLE AS SELECT
陳述式都需要 BigQuery Omni 區域中的空白,才能掃描 Amazon S3 和 Blob 儲存體檔案並載入。詳情請參閱 BigQuery Omni 定價。
事前準備
如要提供 Google Cloud 對其他雲端中的檔案的讀取權限,請管理員建立連結並與您共用。如要瞭解如何建立連線,請參閱「連結至 Amazon S3 」或「Blob 儲存體」。
必要角色
如要取得使用跨雲端轉移功能載入資料所需的權限,請向管理員要求授予您資料集的 BigQuery 資料編輯者 (roles/bigquery.dataEditor
) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
這個預先定義的角色包含使用跨雲端轉移功能載入資料所需的權限。如要查看確切的必要權限,請展開「必要權限」部分:
所需權限
如要使用跨雲端轉移功能載入資料,必須具備下列權限:
-
bigquery.tables.create
-
bigquery.tables.get
-
bigquery.tables.updateData
-
bigquery.tables.update
-
bigquery.jobs.create
-
bigquery.connections.use
如要進一步瞭解 BigQuery 中的 IAM 角色,請參閱「預先定義的角色與權限」一文。
載入資料
您可以使用 LOAD DATA [INTO|OVERWRITE]
陳述式將資料載入 BigQuery。
限制
- 連線和目的地資料集必須屬於相同專案。不支援跨專案載入資料。
- 只有在您將資料從 Amazon Simple Storage Service (Amazon S3) 或 Azure Blob 儲存體轉移至同地 BigQuery 區域時,才支援
LOAD DATA
。詳情請參閱「位置」。- 您可以將資料從任何
US
區域轉移至US
多區域。您也可以從任何EU
區域轉移至EU
多區域。
- 您可以將資料從任何
範例
範例 1
以下範例會將名為 sample.parquet
的 Parquet 檔案從 Amazon S3 值區載入至 test_parquet
資料表,並使用自動偵測結構定義:
LOAD DATA INTO mydataset.testparquet FROM FILES ( uris = ['s3://test-bucket/sample.parquet'], format = 'PARQUET' ) WITH CONNECTION `aws-us-east-1.test-connection`
範例 2
以下範例會將 Blob Storage 中前置字串為 sampled*
的 CSV 檔案,載入至 test_csv
資料表,並使用預先定義的時間欄位分割欄:
LOAD DATA INTO mydataset.test_csv (Number INT64, Name STRING, Time DATE) PARTITION BY Time FROM FILES ( format = 'CSV', uris = ['azure://test.blob.core.windows.net/container/sampled*'], skip_leading_rows=1 ) WITH CONNECTION `azure-eastus2.test-connection`
範例 3
以下範例會使用自動偵測結構定義,將 sample.parquet
檔案中的資料覆寫至現有資料表 test_parquet
:
LOAD DATA OVERWRITE mydataset.testparquet FROM FILES ( uris = ['s3://test-bucket/sample.parquet'], format = 'PARQUET' ) WITH CONNECTION `aws-us-east-1.test-connection`
篩選資料
您可以使用 CREATE TABLE AS SELECT
陳述式和 INSERT INTO SELECT
陳述式,在將資料轉移至 BigQuery 前先篩選資料。
限制
如果
SELECT
查詢的結果在邏輯位元組中超過 60 GiB,查詢就會失敗。系統不會建立資料表,也不會轉移資料。如要瞭解如何減少掃描的資料大小,請參閱「減少查詢中處理的資料」。不支援臨時資料表。
系統不支援轉移 Well-known binary (WKB) 地理空間資料格式。
INSERT INTO SELECT
陳述式不支援將資料轉移至叢集資料表。在
INSERT INTO SELECT
陳述式中,如果目標資料表與SELECT
查詢中的來源資料表相同,則INSERT INTO SELECT
陳述式不會修改目標資料表中的任何資料列。由於 BigQuery 無法讀取跨區域的資料,因此不會修改目的地資料表。CREATE TABLE AS SELECT
和INSERT INTO SELECT
僅支援從 Amazon S3 或 Blob 儲存體將資料轉移至同地 BigQuery 區域。詳情請參閱「位置」。- 您可以將資料從任何
US
區域轉移至US
多區域。您也可以從任何EU
區域轉移至EU
多區域。
- 您可以將資料從任何
範例
範例 1
假設您有一個名為 myawsdataset.orders
的 BigLake 資料表,其中參照 Amazon S3 中的資料。您想將資料從該資料表移轉至美國多區域的 BigQuery 資料表 myotherdataset.shipments
。
首先,顯示 myawsdataset.orders
資料表的相關資訊:
bq show myawsdataset.orders;
輸出結果會與下列內容相似:
Last modified Schema Type Total URIs Expiration ----------------- -------------------------- ---------- ------------ ----------- 31 Oct 17:40:28 |- l_orderkey: integer EXTERNAL 1 |- l_partkey: integer |- l_suppkey: integer |- l_linenumber: integer |- l_returnflag: string |- l_linestatus: string |- l_commitdate: date
接著,顯示 myotherdataset.shipments
資料表的相關資訊:
bq show myotherdataset.shipments
輸出結果大致如下。系統會省略某些資料欄,以便簡化輸出結果。
Last modified Schema Total Rows Total Bytes Expiration Time Partitioning Clustered Fields Total Logical ----------------- --------------------------- ------------ ------------- ------------ ------------------- ------------------ --------------- 31 Oct 17:34:31 |- l_orderkey: integer 3086653 210767042 210767042 |- l_partkey: integer |- l_suppkey: integer |- l_commitdate: date |- l_shipdate: date |- l_receiptdate: date |- l_shipinstruct: string |- l_shipmode: string
您現在可以使用 CREATE TABLE AS SELECT
陳述式,將資料選擇性載入美國多區域中的 myotherdataset.orders
資料表:
CREATE OR REPLACE TABLE myotherdataset.orders PARTITION BY DATE_TRUNC(l_commitdate, YEAR) AS SELECT * FROM myawsdataset.orders WHERE EXTRACT(YEAR FROM l_commitdate) = 1992;
接著,您可以使用新建立的資料表執行彙整作業:
SELECT orders.l_orderkey, orders.l_orderkey, orders.l_suppkey, orders.l_commitdate, orders.l_returnflag, shipments.l_shipmode, shipments.l_shipinstruct FROM myotherdataset.shipments JOIN `myotherdataset.orders` as orders ON orders.l_orderkey = shipments.l_orderkey AND orders.l_partkey = shipments.l_partkey AND orders.l_suppkey = shipments.l_suppkey WHERE orders.l_returnflag = 'R'; -- 'R' means refunded.
當新資料可用時,請使用 INSERT INTO SELECT
陳述式,將 1993 年的資料附加到目的地資料表:
INSERT INTO myotherdataset.orders SELECT * FROM myawsdataset.orders WHERE EXTRACT(YEAR FROM l_commitdate) = 1993;
範例 2
以下範例會將資料插入依擷取時間分區的資料表:
CREATE TABLE mydataset.orders(id String, numeric_id INT64) PARTITION BY _PARTITIONDATE;
建立分區資料表後,您可以將資料插入擷取時間分區資料表:
INSERT INTO mydataset.orders( _PARTITIONTIME, id, numeric_id) SELECT TIMESTAMP("2023-01-01"), id, numeric_id, FROM mydataset.ordersof23 WHERE numeric_id > 4000000;
最佳做法
- 避免載入多個小於 5 MB 的檔案。請改為為檔案建立外部資料表,並將查詢結果匯出至 Amazon S3 或 Blob Storage,以建立較大的檔案。這個方法有助於縮短資料傳輸時間。 如要瞭解最大查詢結果的限制,請參閱「BigQuery Omni 的最大查詢結果大小」。
- 如果來源資料位於 gzip 壓縮檔案中,請在建立外部資料表時,將
external_table_options.compression
選項設為GZIP
。
後續步驟
- 瞭解 BigQuery ML。
- 瞭解 BigQuery Omni。
- 瞭解如何執行查詢。
- 瞭解如何為 BigQuery Omni 設定 VPC Service Controls。
- 瞭解如何安排及管理從 Amazon S3 到 BigQuery 和 Blob Storage 到 BigQuery 的週期性載入工作。