次の方法で共有


外部テーブルをマネージド Unity カタログ テーブルに変換する

Important

この機能はパブリック プレビュー段階であり、現時点では参加しているお客様のみが利用できます。 プレビューに参加するには、 このフォームに入力して申請します。 この機能は、 HMS と Glue Federation を使用してフェデレーションされた外部テーブルの変換のみをサポートします。

このページでは、 SET MANAGED を使用して外部テーブルをマネージド テーブルに変換する方法について説明します。

SET MANAGED の概要

SET MANAGED機能を使用して、外部テーブルを Azure Databricks の Unity カタログマネージド テーブルに変換します。 SET MANAGED には次のような利点があります。

  • テーブル履歴の保持。
  • 同じ名前、設定、アクセス許可、ビューなど、同じテーブル構成を保持する。
  • 予測最適化の恩恵を受ける。 テーブルをマネージドテーブルに変換すると、予測最適化は INHERITに設定されます。つまり、スキーマまたはカタログ レベルから設定が継承されます。 既定では、これは現在無効になっています。 変換されたテーブルで予測最適化を有効にするには、ALTER TABLE <table_name> ENABLE PREDICTIVE OPTIMIZATIONを実行し、ENABLEDではなくINHERITに設定します。

[前提条件]

  • データ形式: 外部テーブルのデータ形式は Delta Lake である必要があります。 Parquet の 1 回限りの変換を実行するには、「 Delta Lake への変換」を参照してください。
  • テーブルの種類: HMS テーブルの種類は、外部の HMS テーブルである必要があります。 テーブルがマネージド HMS テーブルの場合、コマンドは失敗します。
  • ランタイム: Databricks Runtime 17.3 以降
  • アクセス許可: テーブルに対するOWNERまたはMANAGEのアクセス許可、およびCREATEに対するEXTERNAL LOCATIONのアクセス許可。

構文

Unity カタログの外部テーブルを Unity カタログ管理に変換するには、次のコマンドを実行します。

ALTER TABLE source_table SET MANAGED {MOVE | COPY}

パラメーター

  • source_table

    Unity カタログ内の既存の外部テーブル。 外部テーブルには、外部カタログによって管理されるデータとメタデータが含まれます。 変換前に、外部カタログのソース テーブルを削除すると、外部テーブルも Unity カタログにドロップされます。 テーブルがマネージドに変換された後、外部カタログ内のソース テーブルを削除しても、Unity カタログのマネージド テーブルには影響しません。

  • MOVE

    テーブルをマネージドに変換し、外部カタログ内のソース テーブルへのアクセスを無効にします。

    • 外部カタログまたはパスベースのアクセスを介したアクセスは、テーブルの変換後に失敗します。 テーブルのすべてのリーダーとライターは、アクセスに Unity Catalog 名前空間を使用する必要があります。

    • すべてのリーダーとライターは、名前ベースのアクセスを使用する必要があります。 例えば次が挙げられます。

      SELECT * FROM catalog_name.schema_name.table_name;
      
    • パスベースのアクセスはサポートされておらず、テーブルの変換後に失敗します。 例えば次が挙げられます。

      SELECT * FROM delta.`protocol://path/to/table`;
      
    • 外部 (Azure 以外の Databricks) クライアントは、Unity カタログのマネージド テーブルへの読み取りをサポートする必要があります。 互換モードを参照してください。

    • Access Insights ダッシュボードを使用して、テーブルにアクセスする閲覧者とライターが Databricks ランタイムであるか、Azure Databricks 以外の外部クライアントであるかを確認します。

    • Azure Databricks のリーダーとライターは、Databricks Runtime 15.4 LTS 以降を使用する必要があります。 リーダーまたはライターが Databricks Runtime 14.3 LTS 以下を使用している場合は、 Databricks Runtime 14.3 LTS 以降のリーダーとライターの代替オプションを参照してください。

    • ダウンタイムは、変換中にリーダーまたはライターがテーブルにアクセスするときに発生する可能性があります。 詳細については、「 外部テーブルをマネージド Unity カタログ テーブルに変換する」を参照してください。

    • コマンドが中断された場合、マネージドへの変換が不完全であったため、テーブルが外部テーブルとして残っている可能性があります。 コマンドを完了するには、外部テーブルで SET MANAGED をもう一度実行します。

    • 予測最適化は、手動で構成しない限り、 INHERIT に設定されます。 予測最適化が有効になっているかどうかを確認するには、「 予測最適化が有効になっているかどうかを確認する」を参照してください。

    • ロールバック: テーブルの移行をロールバックし、外部カタログ内のソース テーブルへのアクセスを回復するには、 UNSET MANAGED コマンドを実行します。 このテーブルは、コマンドの実行後に外部テーブルになります。 外部テーブルにテーブルを返すには、テーブルを削除すると、次のカタログ同期で外部テーブルとして再フェデレーションされます。

      ALTER TABLE catalog.schema.my_managed_table UNSET MANAGED
      

      Warnung

      テーブルを削除する前に、 UNSET MANAGED を実行する必要があります。 UNSET MANAGED最初に実行せずにテーブルを削除すると、システムの状態が悪く、データの損失や不整合が発生する可能性があります。

    • ロールバックする場合、変換とロールバックの間の外部の場所に対して行ったコミットは、バージョンによって遡ることができますが、タイムスタンプによっては遡ることができません。 ロールバックから 7 日後に、管理された場所のデータが削除されます。 Databricks Runtime 15.4 LTS 以降のリーダーおよびライターの場合、変換後からロールバック前のコミットに対するテーブル履歴は、バージョンを基に過去の状態を参照できますが、タイムスタンプでは参照できません。

    • テーブル変換後は、次の手順を実行する必要があります。

      • 外部テーブルを使用してストリーミング ジョブ (読み取りまたは書き込み) を再開する
      • リーダーとライターがマネージド テーブルで動作することを確認します。
  • COPY

    外部カタログ内のソース テーブルへのアクセスを変更または無効にせずに、テーブルをマネージドに変換します。

    • マネージドへの変換時に、ソース テーブルのデータが外部テーブルに対して定義されたマネージド ストレージの場所にコピーされ、新しいマネージド テーブルと外部カタログ内のソース テーブルという 2 つの個別のコピーが作成されます。
    • 読み取りと書き込みが失敗する MOVE とは異なり、 COPYを使用する場合は、外部カタログのソース テーブルへの読み取りと書き込みを適切に無効にし、ワークロードが新しいカタログに移行されていることを確認する必要があります。
    • ロールバック: テーブルの移行をロールバックするには、ソース テーブルが外部カタログで中断されていないため、 UNSET MANAGED コマンドを実行する必要はありません。 テーブルを削除すると、次のカタログ同期で外部テーブルとして再フェデレーションされます。

変換の確認

外部テーブルがマネージド テーブルに変換されたことを確認できます。

DESCRIBE EXTENDED catalog_name.schema_name.table_name

テーブルが変換されている場合、Typeの下のcol_nameMANAGEDの下にdata_typeと表示されます。

既知の制限事項

外部テーブルからマネージド テーブルへの変換には、次の制限があります。

  • ストリーミング クライアント: 変換後にストリーミング ジョブを再起動する必要があります。

  • 複数のクラウド リージョン: Unity カタログのメタストア、カタログ、またはスキーマの既定の管理場所が、変換される外部テーブルのストレージの場所とは異なるクラウド リージョンにある場合は、リージョン間のデータ転送コストが追加で発生する可能性があります。 クラウド プロバイダーは、Azure Databricks の制御外でこれらの料金を課します。 スキーマ、カタログ、およびメタストアの場所を確認するには、次のコマンドを使用します。

    -- Check schema location
    DESCRIBE SCHEMA EXTENDED catalog_name.schema_name;
    
    -- Check catalog location
    DESCRIBE CATALOG EXTENDED catalog_name;
    
    -- Check metastore location
    DESCRIBE METASTORE;
    

FAQ

外部カタログにテーブルを作成したり、テーブルを変換したりすることはできますか?

はい。外部カタログに外部テーブルまたはマネージド テーブルを作成できます。 動作はスキーマ構成によって異なります。

  • Glue または eHMS スキーマの場合、または Unity カタログで管理された場所が設定されたスキーマの場合: CREATE TABLE foreign_catalog.schema.table実行すると、Unity カタログのマネージド テーブルまたは外部テーブルが作成されます。 テーブルは、外部カタログにプッシュまたは同期されません。
  • 内部 Hive メタストア接続のスキーマの場合: 外部スキーマでテーブルを作成しようとすると、外部テーブルが作成され、 hive_metastoreにテーブルも作成されます。
  • レガシ ワークスペース Hive メタストアの場合: 読み取りと書き込みのフェデレーションであるため、外部カタログにテーブルを作成すると、内部 Hive メタストアにもテーブルが作成されます。

外部テーブルが DBFS でサポートされている場合はどうしますか?

DBFS ベースのテーブルを変換する場合、DBFS パスのクラウド パスへの現在のマッピングが外部テーブルのクラウド パスの場所として格納されます。

スキーマまたはカタログ レベルで変換できますか?

スキーマ内のテーブルを反復処理して個別に変換したり、discoverx labs プロジェクトを使用してスキーマまたはカタログ全体を一度に変換したりできます。

df = (dx.from_tables("prod.*.*")
.with_sql("ALTER TABLE {full_table_name} SET MANAGED;")
.apply())