透過跨雲端作業載入資料

BigQuery 管理員或分析師可以將 Amazon Simple Storage Service (Amazon S3) 值區或 Azure Blob 儲存空間中的資料載入 BigQuery 資料表。您可以將移轉的資料與Google Cloud 區域中的資料合併,也可以運用 BigQuery ML 等 BigQuery 功能。

您可以透過下列方式將資料移轉至 BigQuery:

配額與限制

如要瞭解配額和限制,請參閱查詢工作配額和限制

定價

系統會根據LOAD陳述式,向您收取跨雲端傳輸的位元組費用。如要瞭解定價資訊,請參閱 BigQuery Omni 定價中的「Omni Cross Cloud Data Transfer」一節。

系統會根據 CREATE TABLE AS SELECT 陳述式INSERT INTO SELECT 陳述式,針對跨雲端傳輸的位元組和運算容量向您收費。

LOADCREATE 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 SELECTINSERT 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;

最佳做法

後續步驟