為 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 功能。
事前準備
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the BigQuery Connection and BigQuery Reservation APIs.
-
In the Google Cloud console, activate Cloud Shell.
確認您有 BigQuery 資料集。
請確認您的 Google Cloud SDK 版本為 366.0.0 以上版本:
gcloud version
根據外部資料來源建立 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) |
NUMERIC 或 BIG_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 的情況。