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 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.writeStatsAsStructtrue に設定されていることを確認します。

  • 述語句で頻繁に使用される変数がパーティション列にあることを確認します。

大規模なデータセット(100 TB を超える)では、追加の構成と機能が役立つ場合があります。上記の手順で問題が解決しない場合は、カスタマーケアまたは biglake-help@google.com にお問い合わせください(特に 100 TB を超えるデータセットの場合)。