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
必要に応じて、Google Cloud SDK を更新します。
外部データソースに基づいてクラウド リソース接続を作成し、その接続に Cloud Storage へのアクセス権を付与します。接続を作成するための適切な権限が付与されていない場合は、接続を作成して共有するよう BigQuery 管理者に依頼してください。
必要なロール
Delta Lake テーブルを作成するには、次の権限が必要です。
bigquery.tables.create
bigquery.connections.delegate
BigQuery 管理者(roles/bigquery.admin
)IAM 事前定義ロールには、これらの権限が含まれています。
このロールのプリンシパルでない場合は、これらの権限の付与、または Delta Lake テーブルの作成を管理者に依頼してください。
また、BigQuery ユーザーがテーブルにクエリを実行できるようにするには、接続に関連付けられたサービス アカウントに次の権限とアクセス権が必要です。
- BigQuery 閲覧者(
roles/bigquery.viewer
)ロール - BigQuery 接続ユーザー(
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
},
"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
次の値を置き換えます。
- 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 テーブルを作成すると、標準の BigQuery テーブルと同じように GoogleSQL 構文を使用してクエリを実行できます。次に例を示します。
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 リーダー バージョン 3 がサポートされます。
- Delta Lake V2 チェックポイントはサポートされていません。
- 最後のログエントリ ファイルにリーダー バージョンをリストする必要があります。たとえば、新しいテーブルには
00000..0.json
を含める必要があります。 - 変更データ キャプチャ(CDC)オペレーションはサポートされていません。既存の CDC オペレーションは無視されます。
- スキーマは自動検出されます。BigQuery を使用してスキーマを変更することはできません。
- テーブルの列名は、BigQuery の列名の制限事項に準拠している必要があります。
- マテリアライズド ビューはサポートされていません。
- Read API は Delta Lake ではサポートされていません。
トラブルシューティング
このセクションでは、Delta Lake BigLake テーブルについて説明します。BigQuery クエリのトラブルシューティングの一般的な方法については、クエリに関する問題のトラブルシューティングをご覧ください。
クエリのタイムアウトとリソースエラー
Delta Lake テーブルのログディレクトリ(gs://bucket/warehouse/basictable/_delta_log
)を確認し、バージョン番号が前のチェックポイントより大きい JSON ファイルを探します。バージョン番号は、ディレクトリを一覧表示するか、_delta_log/_last_checkpoint ファイルを調べることで取得できます。10 MiB を超える JSON ファイルを使用すると、テーブルの拡張が遅くなり、タイムアウトやリソースの問題が発生する可能性があります。この問題を解決するには、次のコマンドを使用して新しいチェックポイントを作成し、クエリが JSON ファイルの読み取りをスキップするようにします。
spark.sql("ALTER TABLE delta.`gs://bucket/mydeltatabledir` SET TBLPROPERTIES ('delta.checkpointInterval' = '1')");
その後、同じコマンドを使用して、チェックポイント間隔をデフォルト値の 10 にリセットするか、チェックポイント間に 50 MB を超える JSON ファイルがないようにする値にリセットできます。
列名が無効です
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 カスタマーケアまたは biglake-help@google.com にお問い合わせください。
アクセス拒否エラー
Delta Lake BigLake テーブルの問題を診断するには、次の点を確認します。
ユーザーには必要な権限が明記されています。
パフォーマンス
クエリのパフォーマンスを改善するには、次の手順をお試しください。
Delta Lake ユーティリティを使用して、基盤となるデータファイルを圧縮し、データやメタデータなどの重複ファイルを削除します。
delta.checkpoint.writeStatsAsStruct
がtrue
に設定されていることを確認します。述語句で頻繁に使用される変数がパーティション列にあることを確認します。
大規模なデータセット(100 TB を超える)では、追加の構成と機能が役立つ場合があります。上記の手順で問題が解決しない場合は、カスタマーケアまたは biglake-help@google.com にお問い合わせください(特に 100 TB を超えるデータセットの場合)。