透過跨雲端作業載入資料
BigQuery 管理員或分析師可以將 Amazon Simple Storage Service (Amazon S3) 值區或 Azure Blob 儲存空間中的資料載入 BigQuery 資料表。您可以將移轉的資料與Google Cloud 區域中的資料合併,也可以運用 BigQuery ML 等 BigQuery 功能。
您可以透過下列方式將資料移轉至 BigQuery:
使用
LOAD DATA
陳述式,將 Amazon S3 和 Azure Blob 儲存體中檔案的資料移轉至 BigQuery 資料表。使用
CREATE TABLE AS SELECT
陳述式,先篩選 Amazon S3 或 Blob 儲存空間中的檔案資料,再將結果移轉至 BigQuery 資料表。如要將資料附加至目的地資料表,請使用INSERT INTO SELECT
陳述式。資料操作會套用至參照 Amazon S3 或 Blob Storage 資料的外部資料表。
配額與限制
如要瞭解配額和限制,請參閱查詢工作配額和限制。
定價
系統會根據LOAD
陳述式,向您收取跨雲端傳輸的位元組費用。如要瞭解定價資訊,請參閱 BigQuery Omni 定價中的「Omni Cross Cloud Data Transfer」一節。
系統會根據 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。
限制
- 連線和目的地資料集必須屬於同一個專案。 系統不支援載入跨專案的資料。
LOAD DATA
僅在將資料從 Amazon Simple Storage Service (Amazon S3) 或 Azure Blob 儲存體移轉至同區 BigQuery 時支援。詳情請參閱「位置」。- 您可以將資料從任何
US
區域轉移至US
多區域。您也可以從任何EU
區域轉移至EU
多區域。
- 您可以將資料從任何
範例
範例 1
以下範例會從 Amazon S3 值區將名為 sample.parquet
的 Parquet 檔案載入 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 的邏輯位元組,查詢就會失敗。系統不會建立資料表,也不會轉移資料。如要瞭解如何減少掃描的資料量,請參閱「減少查詢處理的資料量」。系統不支援臨時資料表。
不支援轉移已知二進位 (WKB) 地理空間資料格式。
INSERT INTO SELECT
陳述式不支援將資料轉移至叢集資料表。在
INSERT INTO SELECT
陳述式中,如果目標資料表與SELECT
查詢中的來源資料表相同,則INSERT INTO SELECT
陳述式不會修改目標資料表中的任何資料列。由於 BigQuery 無法跨區域讀取資料,因此不會修改目的地資料表。只有在從 Amazon S3 或 Blob 儲存體將資料移轉至共置的 BigQuery 區域時,才支援
CREATE TABLE AS SELECT
和INSERT INTO SELECT
。詳情請參閱「位置」。- 您可以將資料從任何
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 的週期性載入工作。