使用跨雲端作業載入資料

身為 BigQuery 管理員或分析師,您可以將 Amazon Simple Storage Service (Amazon S3) 值區或 Azure Blob 儲存體中的資料載入至 BigQuery 資料表。您可以將轉移的資料與Google Cloud 區域中的資料彙整,也可以利用 BigQuery ML 等 BigQuery 功能。

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

配額與限制

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

定價

您會因使用 LOAD 陳述句在各雲端間傳輸的位元組數而產生費用。如需定價資訊,請參閱 BigQuery Omni 定價中的「Omni 跨雲資料移轉」一節。

您會因使用 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。

限制

  • 連線和目的地資料集必須屬於相同專案。不支援跨專案載入資料。
  • 只有在您將資料從 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 SELECTINSERT 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;

最佳做法

後續步驟