為 Delta Lake 建立 BigLake 外部資料表

BigLake 可讓您存取 Delta Lake 資料表,並提供更精細的存取權控管機制。Delta Lake 是由 Databricks 開發的開放原始碼表格資料儲存格式,支援 PB 級資料表。

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

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

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

事前準備

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

      Go to project selector

    2. Verify that billing is enabled for your Trusted Cloud project.

    3. Enable the BigQuery Connection and BigQuery Reservation APIs.

      Enable the APIs

    4. In the Trusted 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 管理員建立連線並與您共用。

    8. 必要的角色

      如要建立 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

        在 Trusted Cloud 控制台中查看連線詳細資料時,連線 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

        在 Trusted Cloud 控制台中查看連線詳細資料時,連線 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

        在 Trusted Cloud 控制台中查看連線詳細資料時,連線 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 讀取器版本 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),並尋找版本號碼大於先前檢查點的 JSON 檔案。您可以列出目錄或檢查 _delta_log/_last_checkpoint 檔案,取得版本號碼。如果 JSON 檔案大於 10 MiB,可能會導致資料表擴充速度變慢,進而引發逾時和資源問題。如要解決這個問題,請使用下列指令建立新的檢查點,讓查詢作業略過讀取 JSON 檔案:

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

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

      欄名稱無效

      確認已為 Delta Lake 資料表啟用資料欄對應功能。Reader 2 以上版本支援欄位對應。如果是 Reader 第 1 版,請使用下列指令將「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 時。