為 Delta Lake 建立 BigLake 外部資料表

BigLake 可讓您存取 Delta Lake 資料表,並提供更精細的存取權控管機制。Delta Lake 是 Databricks 開發的開放原始碼表格式資料儲存格式,可支援千兆位元組規模的資料表。

BigQuery 支援 Delta Lake 資料表的下列功能:

  • 存取權委派:使用存取權委派功能,查詢外部資料儲存庫中的結構化資料。存取權委派功能可將 Delta Lake 資料表的存取權,與基礎資料儲存空間的存取權分開。
  • 精細的存取權控管機制:在資料表層級強制執行精細的安全防護機制,包括資料列層級資料欄層級安全防護機制。如果是基於 Cloud Storage 的 Delta Lake 資料表,您也可以使用動態資料遮罩
  • 結構定義演變:系統會自動偵測 Delta Lake 資料表中的結構定義異動。結構定義的變更會反映在 BigQuery 資料表中。

將 Delta Lake 資料表設為 BigLake 資料表時,也能支援所有 BigLake 功能。

事前準備

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. Enable the BigQuery Connection and BigQuery Reservation APIs.

    Enable the APIs

  4. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

  5. 確認您有 BigQuery 資料集

  6. 請確認您的 Google Cloud SDK 版本為 366.0.0 以上版本:

    gcloud version
    

    視需要更新 Google Cloud SDK

  7. 根據外部資料來源建立 Cloud 資源連線,並授予該連線 Cloud Storage 存取權。如果您沒有建立連線的適當權限,請要求 BigQuery 管理員建立連線並與您分享。

必要的角色

如要建立 Delta Lake 資料表,您必須具備下列權限:

  • bigquery.tables.create
  • bigquery.connections.delegate

BigQuery 管理員 (roles/bigquery.admin) 預先定義的 Identity and Access Management 角色包含這些權限。

如果您不是這個角色的主體,請管理員授予這些權限,或為您建立 Delta Lake 資料表。

此外,如要讓 BigQuery 使用者查詢資料表,與連線相關聯的服務帳戶必須具備下列權限和存取權:

  • BigQuery 檢視者 (roles/bigquery.viewer) 角色
  • BigQuery Connection 使用者 (roles/bigquery.connectionUser) 角色
  • 存取包含該資料的 Cloud Storage 值區

如要進一步瞭解 BigQuery 中的 Identity and Access Management 角色和權限,請參閱「預先定義的角色和權限」一文。

使用 Delta Lake 建立資料表

如要建立 Delta Lake 資料表,請按照下列步驟操作。

SQL

使用 CREATE EXTERNAL TABLE 陳述式建立 Delta Lake 資料表:

CREATE EXTERNAL TABLE `PROJECT_ID.DATASET.DELTALAKE_TABLE_NAME`
WITH CONNECTION `PROJECT_ID.REGION.CONNECTION_ID`
OPTIONS (
  format ="DELTA_LAKE",
  uris=['DELTA_TABLE_GCS_BASE_PATH']);

替換下列值:

  • PROJECT_ID:您要在其中建立 Delta Lake 資料表的專案 ID
  • DATASET:包含 Delta Lake 資料表的 BigQuery 資料集
  • DELTALAKE_TABLE_NAME:Delta Lake 資料表名稱
  • REGION:包含建立 Delta Lake 資料表的連線的區域,例如 us
  • CONNECTION_ID:連線 ID,例如 myconnection

    在 Google Cloud 控制台查看連線詳細資料時,連線 ID 是「連線 ID」中顯示的完整連線 ID 最後一節的值,例如 projects/myproject/locations/connection_location/connections/myconnection

  • DELTA_TABLE_GCS_BASE_PATH:Delta Lake 資料表前置字元

bq

在指令列環境中,使用 bq mk 指令建立 Delta Lake 資料表:

bq mk --table --external_table_definition=DEFINITION_FILE PROJECT_ID:DATASET.DELTALAKE_TABLE_NAME

替換下列值:

  • DEFINITION_FILE:資料表定義檔案的路徑
  • PROJECT_ID:您要在其中建立 Delta Lake 資料表的專案 ID
  • DATASET:包含 Delta Lake 資料表的 BigQuery 資料集
  • DELTALAKE_TABLE_NAME:Delta Lake 資料表名稱

REST

使用 BigQuery API 呼叫 tables.insert API 方法,即可建立 Delta Lake 資料表:

REQUEST='{
  "autodetect": true,
  "externalDataConfiguration": {
  "sourceFormat": "DELTA_LAKE",
  "connectionId": "PROJECT_ID.REGION.CONNECTION_ID",
  "sourceUris": [
    "DELTA_TABLE_GCS_BASE_PATH"
  ],
 },
"tableReference": {
"tableId": "DELTALAKE_TABLE_NAME"
}
}'

echo $REQUEST | curl -X POST -d @- -H "Content-Type: application/json" -H "Authorization: Bearer $(gcloud auth print-access-token)" https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT_ID/datasets/DATASET/tables?autodetect_schema=true

替換下列值:

  • PROJECT_ID:您要在其中建立 Delta Lake 資料表的專案 ID
  • REGION:包含建立 Delta Lake 資料表的連線的區域,例如 us
  • CONNECTION_ID:連線 ID,例如 myconnection

    在 Google Cloud 控制台查看連線詳細資料時,連線 ID 是「連線 ID」中顯示的完整連線 ID 最後一節的值,例如 projects/myproject/locations/connection_location/connections/myconnection

  • DELTA_TABLE_GCS_BASE_PATH:Delta Lake 資料表前置字串

  • DELTALAKE_TABLE_NAME:Delta Lake 資料表名稱

  • DATASET:包含 Delta Lake 資料表的 BigQuery 資料集

建立 Delta Lake 資料表時,系統會使用 Delta Lake 前置字元做為資料表的 URI。舉例來說,如果表格在值區 gs://bucket/warehouse/basictable/_delta_log 中含有記錄,表格 URI 就是 gs://bucket/warehouse/basictable。當您對 Delta Lake 資料表執行查詢時,BigQuery 會讀取前置字串下的資料,以識別資料表的目前版本,然後計算資料表的中繼資料和檔案。

雖然您可以不建立連線就建立 Delta Lake 外部資料表,但我們不建議這麼做,原因如下:

  • 使用者嘗試存取 Cloud Storage 中的檔案時,可能會發生 ACCESS_DENIED 錯誤。
  • 精細存取權控管機制等功能僅適用於 Delta Lake BigLake 資料表。

更新 Delta Lake 資料表

如要更新 (重新整理) Delta Lake 資料表的結構定義,請按照下列步驟操作。

bq

在指令列環境中,使用 bq update 指令更新 (重新整理) Delta Lake 資料表的結構定義:

bq update --autodetect_schema PROJECT_ID:DATASET.DELTALAKE_TABLE_NAME

替換下列值:

  • PROJECT_ID:您要在其中建立 Delta Lake 資料表的專案 ID
  • DATASET:包含 Delta Lake 資料表的 BigQuery 資料集
  • DELTALAKE_TABLE_NAME:Delta Lake 資料表名稱

REST

使用 BigQuery API 呼叫 tables.patch API 方法,藉此更新 Delta Lake 資料表:

REQUEST='{
  "externalDataConfiguration": {
    "sourceFormat": "DELTA_LAKE",
    "sourceUris": [
      "DELTA_TABLE_GCS_BASE_PATH"
    ],
    "connectionId": "PROJECT_ID.REGION.CONNECTION_ID",
    "autodetect": true
  }
}'
echo $REQUEST |curl -X PATCH -d @- -H "Content-Type: application/json" -H "Authorization: Bearer $(gcloud auth print-access-token)" https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT_ID/datasets/DATASET/tables/DELTALAKE_TABLE_NAME?autodetect_schema=true

替換下列值:

  • DELTA_TABLE_GCS_BASE_PATH:Delta Lake 資料表前置字元
  • PROJECT_ID:您要在其中建立 Delta Lake 資料表的專案 ID
  • REGION:包含建立 Delta Lake 資料表的連線的區域,例如 us
  • CONNECTION_ID:連線 ID,例如 myconnection

    在 Google Cloud 控制台查看連線詳細資料時,連線 ID 是「連線 ID」中顯示的完整連線 ID 最後一節的值,例如 projects/myproject/locations/connection_location/connections/myconnection

  • DELTALAKE_TABLE_NAME:Delta Lake 資料表名稱

  • DATASET:包含 Delta Lake 資料表的 BigQuery 資料集

查詢 Delta Lake 資料表

建立 Delta Lake BigLake 資料表後,您可以使用 GoogleSQL 語法查詢資料表,就像查詢標準 BigQuery 資料表一樣。例如:

SELECT field1, field2 FROM mydataset.my_cloud_storage_table;

詳情請參閱「查詢 BigLake 資料表中的 Cloud Storage 資料」。

系統會使用與服務帳戶相關聯的外部連線連線至資料儲存庫。由於服務帳戶會從資料儲存庫擷取資料,使用者只需要存取 Delta Lake 資料表。

資料對應

BigQuery 會將 Delta Lake 資料類型轉換為 BigQuery 資料類型,如下表所示:

Delta Lake 類型 BigQuery 類型
boolean BOOL
byte INT64
int INT64
long INT64
float FLOAT64
double FLOAT64
Decimal(P/S) NUMERICBIG_NUMERIC,視精確度而定
date DATE
time TIME
timestamp (not partition column) TIMESTAMP
timestamp (partition column) DATETIME
string STRING
binary BYTES
array<Type> ARRAY<Type>
struct STRUCT
map<KeyType, ValueType> ARRAY<Struct<key KeyType, value ValueType>>

限制

Delta Lake 資料表具有 BigLake 資料表限制,以及下列限制:

  • 支援 Delta Lake reader version 3,並使用相對路徑刪除向量和資料欄對應。
  • 不支援 Delta Lake V2 檢查點。
  • 您必須在最後一個記錄項目檔案中列出讀取器版本。例如,新資料表必須包含 00000..0.json
  • 不支援變更資料擷取 (CDC) 作業。系統會忽略任何現有的 CDC 作業。
  • 系統會自動偵測結構定義。不支援使用 BigQuery 修改結構定義。
  • 資料表資料欄名稱必須遵守 BigQuery 的資料欄名稱限制
  • 不支援具體化檢視表。
  • Delta Lake 不支援 Read API。

疑難排解

本節提供 Delta Lake BigLake 資料表的相關說明。如需有關 BigQuery 查詢疑難排解的一般說明,請參閱「排解查詢問題」。

查詢逾時和資源錯誤

請查看 Delta Lake 資料表的記錄目錄 (gs://bucket/warehouse/basictable/_delta_log),找出版本號碼大於先前checkpoint的 JSON 檔案。您可以列出目錄或檢查 _delta_log/_last_checkpoint 檔案,取得版本號碼。超過 10 MiB 的 JSON 檔案可能會導致資料表擴充作業速度變慢,進而導致逾時和資源問題。如要解決這個問題,請使用下列指令建立新的檢查點,讓查詢略過讀取 JSON 檔案:

  spark.sql("ALTER TABLE delta.`gs://bucket/mydeltatabledir` SET TBLPROPERTIES ('delta.checkpointInterval' = '1')");

使用者可以使用相同的指令,將檢查點間隔重設為預設值 10,或是設定為避免檢查點之間的 JSON 檔案超過 50 MB。

欄名稱無效

確認已為 Delta Lake 資料表啟用資料欄對應功能。Reader 2 以上版本支援資料欄對應功能。針對 Reader 1.0 版,請使用下列指令將「delta.columnMapping.mode」設為「name」:

spark.sql("ALTER TABLE delta.`gs://bucket/mydeltatabledir` SET TBLPROPERTIES ('delta.columnMapping.mode' = 'name', 'delta.minReaderVersion' = '3', 'delta.minWriterVersion' = '7')");

如果無效的資料欄名稱符合彈性資料欄名稱限制,請與 Cloud Customer Care 團隊聯絡,或寄信至 biglake-help@google.com

存取遭拒錯誤

如要診斷 Delta Lake BigLake 資料表的問題,請檢查下列項目:

成效

如要改善查詢效能,請嘗試下列步驟:

  • 使用 Delta Lake 公用程式壓縮基礎資料檔案,並移除資料和中繼資料等多餘的檔案。

  • 確認 delta.checkpoint.writeStatsAsStruct 已設為 true

  • 請確認常用於述詞子句的變數位於分區欄中。

大型資料集 (超過 100 TB) 可能會因額外設定和功能而有所助益。如果上述步驟無法解決問題,建議您與客戶服務團隊聯絡,或傳送電子郵件至 biglake-help@google.com,尤其是資料集大小超過 100 TB 的情況。