ストリーミング テーブルと具体化されたビューへの外部データ アクセスを有効にする

Unity Catalogへの外部データアクセスを有効にしていれば、パイプライン管理およびスタンドアロンのマテリアル化ビューやストリーミングテーブルへの外部データアクセスを追加できます。 これにより、外部の Delta および Iceberg クライアントは、完全なデータ コピーを必要とせずに、Unity カタログおよび Iceberg カタログ REST API を使用してデータセットにアクセスできます。

外部データアクセスは、Lakeflowパイプラインで管理されるデータセットや、スタンドアロンのマテリアル化されたビューやストリーミングテーブルに適用されます。

能力

外部データアクセスを利用することで、パイプライン管理およびスタンドアロンのマテリアル化ビューやストリーミングテーブルで利用可能な同じデータをAzure Databricksに公開し、データの複製を作成することはありません。 これにより、パフォーマンスと機能に関して次の特性が得られます。

  • データ コピーは必要ありません。 完全なデータセットを複製することなく、外部アクセスが有効になります。
  • API 経由の外部アクセス: Delta Lake または Iceberg API を使用して、具体化されたビューとストリーミング テーブルを読み取ります。
  • 書き込み後の読み取り整合性: データセットの更新後、外部の読み取りユーザーは最新のデータにアクセスできるため、古いデータ参照が生じることはありません。 更新プログラムは、更新時にすぐに使用できます。
  • 単一テーブル オブジェクト: データセットは、Unity カタログ API 内のソース データセットと同じ名前の マネージド テーブル として外部に表示されます。
  • 低コスト: 完全なデータセットはコピーされないため、外部アクセスを提供するためのオーバーヘッドは低くなります。

必要条件

データセットの要件は次のとおりです。

  • Unity カタログ: ストリーミング テーブルと具体化されたビューは、Unity カタログを使用している必要があります。
  • Databricks ランタイムのバージョン: Databricks Runtime 17.3 以降を使用している必要があります。
  • デフォルトの出版モード: 外部可読性はデフォルトの公開モードでのみサポートされています。 外部読みやすさを使いたい場合は、 デフォルトのパブリッシングモードに移行してください。 外部メタデータに依存する機能、例えばマテリアライズドビューCDFはレガシーパブリッシングモードで動作します。

クライアントの要件は次のとおりです。

  • Delta API のバージョン: クライアントは、削除ベクターを含む Delta Lake API 4.0.0 以降をサポートし、アクセスに Unity カタログ API を使用する必要があります。
  • Iceberg API バージョン: または、クライアントは Iceberg v3 仕様をサポートする Iceberg カタログ API を使用してアクセスできます。
  • Unity カタログの権限: データセットを外部から読み取るプリンシパルには、スキーマに対する EXTERNAL USE SCHEMA 特権 と、テーブルに対する SELECT 権限が必要です。

Note

クライアントがこれらの要件をサポートしていない場合は、すべての Delta クライアントと Iceberg クライアントをサポートする 互換モードを使用することもできますが、データセットの完全なコピーを作成する必要があります。

データセットのアクセスを有効にする方法

データセットの外部アクセスを可能にするには2つのステップがあります。

  1. パイプライン構成またはテーブルプロパティを使って外部メタデータを有効にします。 テーブルレベルの設定は、両方が設定されている場合、パイプライン構成よりも優先され、パイプライン管理型およびスタンドアロンのストリーミングテーブルおよびマテリアライズドビューの両方でサポートされています。

    • パイプライン構成:pipelines.externalMetadata.enabledtrueに設定して、パイプライン内のすべてのデータセットで外部メタデータを有効にしてください。 Databricks SQLで作成されたスタンドアロンのマテリアライズドビューやストリーミングテーブルにはパイプライン構成はありません。代わりにテーブルプロパティを使いましょう。

      パイプライン設定 UI

      パイプライン設定で以下の手順を完了してください:

      1. パイプラインを開き 、[設定] をクリックします。
      2. [ 構成] で、キーと値のペア ( キーpipelines.externalMetadata.enabledtrueを追加します。
      3. 保存 をクリックします。

      パイプライン構成 JSON

      パイプライン JSON の configuration セクションで、次を追加します。

      {
        "configuration": {
          "pipelines.externalMetadata.enabled": "true"
        }
      }
      
    • テーブルの性質: ストリーミングテーブルまたはマテリアライズドビューの定義に以下のプロパティを追加してください。 Lakeflow Connect Pipelinesについては、「 Set Delta table properties」をご覧ください。

      CREATE OR REFRESH [MATERIALIZED VIEW | STREAMING TABLE] tbl_name
      TBLPROPERTIES('pipelines.externalMetadata.enabled' = 'true')
      

    構成を保存した後、パイプラインを実行または再起動して変更を適用します。

    • トリガーされたパイプライン: パイプラインを 1 回実行します。
    • 連続パイプライン: パイプラインを停止して再起動します。

    スタンドアロンのDatabricks SQLオブジェクトの場合は、テーブルプロパティを CREATE OR REPLACE MATERIALIZED VIEW または CREATE OR REFRESH STREAMING TABLE に使います。 createやrefresh文はプロパティを適用します。

  2. モダンなIcebergクライアントでデータセットを読み込む予定がある場合は、外部メタデータプロパティに加えて以下のUniForm Iceberg V3プロパティを追加してください。 Lakeflow Connect Pipelinesについては、「 Set Delta table properties」をご覧ください。

    プロパティ Use
    'pipelines.externalMetadata.enabled' = 'true' テーブルの外部アクセスを有効にしてください。 このテーブルレベルの設定は、両方が設定されている場合、パイプライン構成よりも優先されます。
    'delta.columnMapping.mode' = 'name' Iceberg には列マッピングが必要です。
    'delta.enableRowTracking' = 'true' Icebergの読み取りに行トラッキングを有効にしてください。
    'delta.universalFormat.enabledFormats' = 'iceberg' Iceberg読み取りを有効にしてください。
    'delta.enableIcebergCompatV3' = 'true' Iceberg の読み取りには Iceberg V3 を使用してください。
    CREATE OR REFRESH [MATERIALIZED VIEW | STREAMING TABLE] tbl_name
    TBLPROPERTIES(
      'delta.columnMapping.mode' = 'name',
      'delta.enableRowTracking' = 'true',
      'delta.enableIcebergCompatV3' = 'true',
      'delta.universalFormat.enabledFormats' = 'iceberg',
      'pipelines.externalMetadata.enabled' = 'true')
    

    マテリアライズされたビューの場合は、同等の USING ICEBERG 構文を使うことができます。

    CREATE OR REFRESH MATERIALIZED VIEW tbl_name USING ICEBERG
    

    パイプライン管理データセットについては、上記のpipeline update指示を使ってIcebergプロパティを適用してください。 スタンドアロンのDatabricks SQLオブジェクトの場合は、更新されたプロパティでオブジェクト定義を再実行してください。 CREATE OR REPLACE MATERIALIZED VIEWをマテリアライズされたビューに、CREATE OR REFRESH STREAMING TABLEをストリーミングテーブルに使いましょう。 データセットのプロパティを見るには、 DESCRIBE DETAIL または DESCRIBE EXTENDED SQL文を使います。

外部データアクセスのトラブルシューティング

外部メタデータが古くなったと思われる場合は、テーブルの MODIFY 権限を持つプリンシパルが、Databricks Runtime 17.3 以上の環境で共有クラスタの計算でメタデータ更新を手動でトリガーできます:

REPAIR TABLE <catalog>.<schema>.<table-name> SYNC METADATA;

Icebergメタデータの有無は、カタログエクスプローラーUIのテーブル詳細ページで確認できます。 または、SQLエディタやAzure Databricksノートブックで以下のコマンドを実行することもできます:

DESCRIBE DETAIL <catalog>.<schema>.<table-name>;
DESCRIBE EXTENDED <catalog>.<schema>.<table-name>;

ストリーミングテーブルについては、Icebergのメタデータ版と最新のストリーミングテーブル版を比較してください。 マテリアライズドビューのバージョン比較はまだ利用できません。

外部クライアントからのデータの読み取り

以下のセクションでは、異なるクライアントや環境からデータセットを読み取る方法の例を示します。

設定の詳細については、 デルタクライアントアクセス および アイスバーグクライアントアクセスをご覧ください。

Spark デルタ リーダーで Unity REST API を使用する

Apache Spark™ バージョン 4.0 以降を使用します。 https://spark.apache.org/downloads.htmlからダウンロードできます。

  1. クラウド プロバイダーに基づいて、次のコマンドを実行して、Delta 4.0 と Unity カタログを使用して Spark SQL シェルを開始します。

    AWS

    bin/spark-sql \
        --packages org.apache.spark:spark-hadoop-cloud_2.13:4.0.0,io.unitycatalog:unitycatalog-spark_2.13:0.3.1 \
        --conf spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension \
        --conf spark.sql.catalog.spark_catalog=io.unitycatalog.spark.UCSingleCatalog \
        --conf spark.hadoop.fs.s3.impl=org.apache.hadoop.fs.s3a.S3AFileSystem \
        --conf spark.sql.catalog.<uc-catalog-name>=io.unitycatalog.spark.UCSingleCatalog \
        --conf spark.sql.catalog.<uc-catalog-name>.uri=<workspace_url> \
        --conf spark.sql.catalog.<uc-catalog-name>.token=<PAT> \
        --conf spark.sql.defaultCatalog=<uc-catalog-name>
    

    紺碧

    bin/spark-sql \
        --packages org.apache.hadoop:hadoop-azure:3.3.6,io.unitycatalog:unitycatalog-spark_2.13:0.3.1 \
        --conf spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension \
        --conf spark.sql.catalog.spark_catalog=io.unitycatalog.spark.UCSingleCatalog \
        --conf spark.sql.catalog.<uc-catalog-name>=io.unitycatalog.spark.UCSingleCatalog \
        --conf spark.sql.catalog.<uc-catalog-name>.uri=<workspace_url> \
        --conf spark.sql.catalog.<uc-catalog-name>.token=<PAT> \
        --conf spark.sql.defaultCatalog=<uc-catalog-name>
    

    GCP

    bin/spark-sql \
        --packages io.unitycatalog:unitycatalog-spark_2.13:0.3.1  \
        --conf spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension \
        --conf spark.sql.catalog.spark_catalog=io.unitycatalog.spark.UCSingleCatalog \
        --conf spark.hadoop.fs.gs.impl=com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem \
        --conf spark.hadoop.fs.AbstractFileSystem.gs.impl=com.google.cloud.hadoop.fs.gcs.GoogleHadoopFS \
        --conf spark.sql.catalog.<uc-catalog-name>=io.unitycatalog.spark.UCSingleCatalog \
        --conf spark.sql.catalog.<uc-catalog-name>.uri=<workspace_url> \
        --conf spark.sql.catalog.<uc-catalog-name>.token=<PAT> \
        --conf spark.sql.defaultCatalog=<uc-catalog-name>
    
  2. SQL シェルから、Spark SQL を使用してデータセットにアクセスできるようになりました。 例えば次が挙げられます。

    spark-sql ()> SELECT * FROM <uc-catalog>.<uc-schema>.<uc-table-name>;
    

Snowflake Iceberg Reader を使用する

Snowflake 内では、Iceberg Reader を使用できます。 これには、Snowflake での Iceberg v3 のサポートが必要です。

  1. Snowflake で Iceberg REST カタログを設定します。

    CREATE OR REPLACE CATALOG INTEGRATION my_uc_int
      CATALOG_SOURCE = ICEBERG_REST
      TABLE_FORMAT = ICEBERG
      CATALOG_NAMESPACE = '<uc-schema-name>'
      REST_CONFIG = (
        CATALOG_URI = '<workspace-url>/api/2.1/unity-catalog/iceberg-rest'
        CATALOG_NAME = '<uc-catalog-name>'
        ACCESS_DELEGATION_MODE = VENDED_CREDENTIALS
      )
      REST_AUTHENTICATION = (
        TYPE = BEARER
        BEARER_TOKEN = '<PAT>'
      )
      ENABLED = TRUE;
    
    CREATE OR REPLACE ICEBERG TABLE my_table
      CATALOG = 'my_uc_int'
      CATALOG_TABLE_NAME = '<uc-table-name>';
    
  2. Snowflake SQLからデータセットにアクセスしてください。

    ALTER ICEBERG TABLE my_table REFRESH;
    SELECT * FROM my_table;
    

Spark Iceberg リーダーで Iceberg REST カタログを使用する

Apache Spark™ バージョン 4.0 以降を使用します。 https://spark.apache.org/downloads.htmlからダウンロードできます。

  1. AWS で次のコマンドを実行して、Iceberg v3 で Spark SQL シェルを開始します。

    bin/spark-sql \
      --packages org.apache.iceberg:iceberg-spark-runtime-4.0_2.13:1.10.0,org.apache.iceberg:iceberg-aws-bundle:1.10.0 \
      --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \
      --conf spark.sql.catalog.<uc-catalog-name>=org.apache.iceberg.spark.SparkCatalog \
      --conf spark.sql.catalog.<uc-catalog-name>.io-impl=org.apache.iceberg.aws.s3.S3FileIO \
      --conf spark.sql.catalog.<uc-catalog-name>.type=rest \
      --conf spark.sql.catalog.<uc-catalog-name>.uri=<workspace_url>/api/2.1/unity-catalog/iceberg-rest \
      --conf spark.sql.catalog.<uc-catalog-name>.token='<PAT>' \
      --conf spark.sql.catalog.<uc-catalog-name>.warehouse=<uc-catalog-name> \
      --conf spark.sql.iceberg.vectorization.enabled=false
    
  2. Spark SQL からデータセットにアクセスします。

    spark-sql ()> SELECT * FROM <uc-catalog>.<uc-schema>.<uc-table-name>;
    

互換モードから移行する

現在互換性モードを使用してデータセットを共有している場合は、外部データ アクセスを使用して移行できます。

  1. データセットのアクセスを有効にする方法に関する記事の手順に従って、この機能を有効にします。
  2. 互換モードを無効にします。 互換モードの無効化を参照してください

制限事項

ストリーミング テーブルと具体化されたビューの外部データ アクセスに関する既知の制限事項を次に示します。

  • 外部書き込み: パイプライン データセットへの外部書き込みはサポートされていません。
  • Path-Based アクセス: パスベースのアクセスを必要とする外部リーダー (UC API インターフェイスではなく、ストレージの場所を直接読み取る) はサポートされていません。 パスベースのアクセスをサポートするには、 互換性モードを使用できます。これはパスベースのアクセスをサポートしますが、データセットの完全なコピーが必要です。
  • セキュリティ機能: 外部読み取りからの 行レベルのセキュリティ または 列レベルのマスク のサポートはサポートされていません。
  • タイムトラベル:この機能によるタイムトラベルはサポートされていません。
  • カタログ コミット (ベータ):カタログコミットは外部データ アクセスと互換性がありません。 ストリーミングテーブルやマテリアライズドビューで外部データアクセスを利用するには、まずカタログコミットを無効にする必要があります。
  • Fabric: Microsoft Fabricからの読み取りはサポートされていません。