DML ステートメントを使用してデータを変更する

データの変更では、Lakehouse ランタイム カタログの Apache Iceberg テーブルのレコードを更新、削除、統合できます。

テーブルで BigQuery DML が有効になっている場合、BigQuery から Spark や Trino などのオープンソース エンジンとともに標準の DML ステートメントを実行できます。これにより、Cloud Storage に保存されているデータの単一コピーで完全な書き込み相互運用性を実現できます。

始める前に

  1. Google Cloud プロジェクトに対して課金が有効になっていることを確認します。

  2. BigLake API がまだ有効になっていない場合は、有効にします。

    API を有効にするために必要なロール

    API を有効にするには、serviceusage.services.enable 権限が必要です。プロジェクトを作成した場合は、オーナーロール(roles/owner)を通じてこの権限がすでに付与されている可能性があります。それ以外の場合は、Service Usage 管理者ロール(roles/serviceusage.serviceUsageAdmin)を通じてこの権限を取得できます。ロールを付与する方法を確認する。

    API の有効化

  3. Apache Iceberg REST カタログ エンドポイントを使用して、Lakehouse ランタイム カタログを設定します。

必要なロール

テーブル内のデータを変更するために必要な権限を取得するには、プロジェクトとストレージ バケットに対する次の IAM ロールを付与するよう管理者に依頼してください。

  • 認証情報ベンディング モードでテーブルデータを書き込む: BigLake 編集者(roles/biglake.editor)- プロジェクト
  • 認証情報ベンディング モード以外でテーブルデータを書き込む:
    • BigLake 編集者(roles/biglake.editor)- プロジェクト
    • ストレージ オブジェクト ユーザー(roles/storage.objectUser) - Cloud Storage バケット

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

テーブルの機能とサポート

Lakehouse ランタイム カタログでテーブルを使用する場合は、さまざまなテーブル タイプとそのオプトイン機能を理解しておくと便利です。Apache Iceberg テーブルの使用の詳細については、Apache Iceberg テーブルの概要をご覧ください。

サポートされている Iceberg テーブル

Apache Iceberg V2(一般提供版)テーブルと V3(プレビュー版)テーブルのみがサポートされています。Iceberg V1 テーブルはサポートされていません。既存の V1 テーブルをアップグレードするには、Iceberg V1 テーブルを V2 にアップグレードするをご覧ください。

テーブル オプションを使用する(プレビュー)

特定のテーブル プロパティを構成することで、BigQuery データ操作言語(DML)や自動テーブル管理などの BigQuery マネージド機能を使用できます。これらの機能は、テーブルの作成場所に応じて異なる方法で有効になります。

  • BigQuery から: BigQuery DML と自動テーブル管理はデフォルトで有効になっています。
  • オープンソース エンジンから: オプトインするには、テーブル プロパティを明示的に構成する必要があります。詳細については、テーブル オプションを構成するをご覧ください。

データの更新

テーブル内の既存の行を更新します。

Spark

ALTER TABLE TABLE_NAME SET TBLPROPERTIES ('gcp.biglake.bigquery-dml.enabled' = true);

UPDATE TABLE_NAME SET data = 'updated row' WHERE id = 1;

Trino

ALTER TABLE TABLE_NAME SET PROPERTIES "gcp.biglake.bigquery-dml.enabled" = 'true';

UPDATE TABLE_NAME SET data = 'updated row' WHERE id = 1;

BigQuery

UPDATE `PROJECT_ID.CATALOG_ID.NAMESPACE.TABLE_NAME`
SET data = "updated row"
WHERE id = 1;

次のように置き換えます。

  • PROJECT_ID: 実際の Google Cloudプロジェクト ID。
  • CATALOG_ID: Lakehouse ランタイム カタログ ID。
  • NAMESPACE: Iceberg Namespace の名前。
  • TABLE_NAME: Iceberg テーブルの名前。

データの削除

テーブルから特定の行を削除します。

Spark

ALTER TABLE TABLE_NAME SET TBLPROPERTIES ('gcp.biglake.bigquery-dml.enabled' = true);

DELETE FROM TABLE_NAME WHERE id = 1;

Trino

ALTER TABLE TABLE_NAME SET PROPERTIES "gcp.biglake.bigquery-dml.enabled" = 'true';

DELETE FROM TABLE_NAME WHERE id = 1;

BigQuery

DELETE FROM `PROJECT_ID.CATALOG_ID.NAMESPACE.TABLE_NAME`
WHERE id = 1;

データを統合する

移行元のテーブルのデータを移行先の Iceberg テーブルに統合します。

Spark

ALTER TABLE TARGET_TABLE SET TBLPROPERTIES ('gcp.biglake.bigquery-dml.enabled' = true);

MERGE INTO TARGET_TABLE t
USING SOURCE_TABLE s
ON t.id = s.id
WHEN MATCHED THEN
  UPDATE SET t.data = s.data
WHEN NOT MATCHED THEN
  INSERT (id, data) VALUES (s.id, s.data);

Trino

ALTER TABLE TARGET_TABLE SET PROPERTIES "gcp.biglake.bigquery-dml.enabled" = 'true';

MERGE INTO TARGET_TABLE t
USING SOURCE_TABLE s
ON t.id = s.id
WHEN MATCHED THEN
  UPDATE SET t.data = s.data
WHEN NOT MATCHED THEN
  INSERT (id, data) VALUES (s.id, s.data);

BigQuery

MERGE `PROJECT_ID.CATALOG_ID.NAMESPACE.TARGET_TABLE` t
USING `PROJECT_ID.CATALOG_ID.NAMESPACE.SOURCE_TABLE` s
ON t.id = s.id
WHEN MATCHED THEN
  UPDATE SET data = s.data
WHEN NOT MATCHED THEN
  INSERT (id, data) VALUES (id, data);

次のステップ