Snowflakeで管理されたテーブルを Snowflake Open Catalog と同期する

Apache Spark™などのサードパーティエンジンを使用してSnowflakeが管理する Apache Iceberg™ テーブルをクエリするには、テーブルを Snowflake Open Catalog と同期します。

このトピックでは、Snowflakeのカタログ統合と Open Catalog の外部カタログを使用して、Snowflakeが管理するIcebergテーブルを Snowflake Open Catalog と同期する方法について説明します。

重要

サードパーティ製エンジンがカタログの 2 番目の名前空間レベルまでにあるテーブルしかクエリできない場合は、Snowflake 管理の Iceberg テーブルを 1 つの親名前空間を持つ Open Catalog に同期する必要があります。そうしないと、SnowflakeはOpen Catalogの3番目の名前空間レベルにテーブルを同期し、テーブルにクエリできません。

Snowflake 管理の Iceberg テーブルを 2 つの親名前空間ではなく 1 つの親名前空間で同期するには、データベースの作成時に CATALOG_SYNC_NAMESPACE_MODE プロパティを FLATTEN にセットします。詳細については、 CREATE DATABASE をご参照ください。既存のデータベースに対してこのモードを変更することはできません。CATALOG_SYNC が有効な既存のデータベース内のテーブルは、2 つの親名前空間を持つ Open Catalog に同期されます。

ステップ1: BASE_LOCATION_PREFIX をセット

Snowflakeは、各Icebergテーブルのファイルを、動的に生成された文字列(ランダム ID)を含むディレクトリの下に書き込みます。

Open Catalog が同期する Snowflake 管理テーブルをすべて参照できるようにするには、アカウント、データベース、またはスキーマレベルで BASE_LOCATION_PREFIXmy-open-catalog-tables など)を使用し、 CREATE ICEBERG TABLE ステートメントでは BASE_LOCATION パラメーターを省略することをお勧めします。これにより、アカウント、データベース、またはスキーマに作成するすべてのIceberg テーブルのファイルが、プレフィックスと同じ名前の既知のディレクトリの下に整理されます。詳細情報については、 Snowflake管理テーブルのデータとメタデータのディレクトリ <label-tables_iceberg_configure_external_volume_base_location> をご参照ください。

次のステートメントは、 open_catalog というスキーマに BASE_LOCATION_PREFIX をセットします。

ALTER SCHEMA open_catalog
  SET BASE_LOCATION_PREFIX = 'my-open-catalog-tables';
Copy

ステップ2: 外部ボリュームを作成する

まだお持ちでない場合は、テーブルデータとメタデータを保存するクラウドストレージ場所へのアクセスを提供する外部ボリュームをSnowflakeで作成することから始めます。

注釈

STORAGE_BASE_URL に指定するパスに BASE_LOCATION_PREFIX を含めないでください。

ご利用のクラウドストレージサービスの手順に従ってください。

ステップ3: Open Catalog リソースを構成する

次に、このセクションの手順を実行して、 Open Catalog アカウントに外部カタログとサービス接続を作成します。

  1. カタログの作成 の手順に従って、 Open Catalog アカウントに外部カタログを作成します。外部カタログの以下の設定が構成されていることを確認します。

    • External のトグルが有効になっています。

    • Default base location は、 ステップ2: 外部ボリュームを作成する で作成した外部ボリュームの STORAGE_BASE_URL と、スキーマにセットした BASE_LOCATION_PREFIX を組み合わせたものです。例えば https://<storage_base_url>/<base_url_prefix>/ です。

    Open Catalog はSnowflakeで管理されているテーブルをこの外部カタログに同期します。

  2. Snowflake用のサービス接続がまだない場合は、 サービス接続の構成 の手順に従って、 Open Catalog アカウントにSnowflakeエンジン用の接続を作成します。

  3. 外部カタログへのアクセスを許可する権限を持つ、外部カタログ用のカタログロールを構成します。手順については、 カタログへの権限の付与 を参照してください。

    カタログロールには、カタログ上で以下の権限が必要です。

    • TABLE_CREATE

    • TABLE_WRITE_PROPERTIES

    • TABLE_DROP

    • NAMESPACE_CREATE

    • NAMESPACE_DROP

    これらの権限をそれぞれカタログロールに付与するか、これらの権限を含む CATALOG_MANAGE_CONTENT 権限を付与することができます。詳しくは、 Snowflake Open Catalogのカタログ権限 をご覧ください。

  4. サービス接続のプリンシパルロールにカタログロールを添付します。これにより、サービス接続はカタログにアクセスできます。手順については、 プリンシパルロールへのカタログロールの付与 を参照してください。

ステップ4: Open Catalog のカタログ統合を作成する

CREATE CATALOG INTEGRATION (Snowflake Open Catalog) コマンドを使用して、 Open Catalog のカタログ統合を作成します。

CATALOG_NAME の場合は、 Open Catalog アカウントで構成した外部カタログの名前を指定します。Snowflake は、Snowflake 内のテーブルとその親名前空間を、 Open Catalog 内のこの外部カタログに同期します。例えば、Snowflakeに db1.public.table1 Icebergテーブルが登録されていて、カタログ統合で catalog1 を指定した場合、Snowflakeは次の完全修飾名を持つ Open Catalog とテーブルを同期します: catalog1.db1.public.table1

カタログ統合の作成に関する問題のトラブルシューティングについては、 オープンカタログのカタログ統合が作成できない をご参照ください。

CREATE OR REPLACE CATALOG INTEGRATION my_open_catalog_int
  CATALOG_SOURCE = POLARIS
  TABLE_FORMAT = ICEBERG
  REST_CONFIG = (
    CATALOG_URI = 'https://<orgname>-<my-snowflake-open-catalog-account-name>.snowflakecomputing.com/polaris/api/catalog'
    CATALOG_NAME = 'myOpenCatalogExternalCatalogName'
  )
  REST_AUTHENTICATION = (
    TYPE = OAUTH
    OAUTH_CLIENT_ID = 'myClientId'
    OAUTH_CLIENT_SECRET = 'myClientSecret'
    OAUTH_ALLOWED_SCOPES = ('PRINCIPAL_ROLE:ALL')
  )
  ENABLED = TRUE;
Copy

注釈

このカタログ統合を使用して、1つまたは複数のSnowflake管理テーブルを同期することができます。

ステップ5: カタログ同期のセットアップ

Snowflake が管理する Iceberg テーブルを Open Catalog に同期するには、 Open Catalog で Snowflake がテーブルを同期する外部カタログを指定する必要があります。これを構成するには、 CATALOG_SYNC パラメーターを Open Catalog 用のカタログ統合名にセットします。

データベースレベルで CATALOG_SYNC をセットします。

この例では、 CATALOG_SYNC パラメーターをデータベース・レベルでセットします。これらのステートメントを実行すると、Snowflakeは db1 データベース内のすべてのSnowflake管理Icebergテーブルを、 my_open_catalog_int カタログ統合に指定した Open Catalog の外部カタログに同期します。詳細については、 ALTER DATABASE コマンドをご参照ください。

ALTER DATABASE db1 SET CATALOG_SYNC = 'my_open_catalog_int';
Copy

データベースを作成するときに、データベースレベルで CATALOG_SYNC をセットすることもできます。例:

CREATE DATABASE db2
  CATALOG_SYNC = 'my_open_catalog_int';
Copy

詳細については、 CREATE DATABASE をご参照ください。

スキーマレベルで CATALOG_SYNC をセットします。

この例では、スキーマ・レベルで CATALOG_SYNC パラメーターをセットします。これらのステートメントを実行すると、Snowflakeは public スキーマ内のすべてのSnowflake管理Icebergテーブルを、 my_open_catalog_int カタログ統合に指定した Open Catalog の外部カタログに同期します。詳細については、 ALTER SCHEMA コマンドをご参照ください。

ALTER SCHEMA public SET CATALOG_SYNC = 'my_open_catalog_int';
Copy

スキーマを作成する際に、スキーマレベルで CATALOG_SYNC をセットすることもできます。例:

CREATE SCHEMA schema1
  CATALOG_SYNC = 'my_open_catalog_int';
Copy

詳細については、 CREATE SCHEMA をご参照ください。

注釈

  • 次のようなこともできます。

    • CATALOG_SYNC をアカウントまたはテーブルレベルでセットします。

    • CATALOG_SYNC を違うレベルでオーバーライドします。例えば、 CATALOG_SYNC をデータベース・レベルでセットし、その値をデータベース内の myschema スキーマで上書きすることができます。その結果、 myschema スキーマの Snowflake 管理の Iceberg テーブルは、 Open Catalog の外部カタログに同期され、データベース内の他の Snowflake 管理の Iceberg テーブルとは異なります。

    詳細については、 CATALOG_SYNC および パラメーターの階層と型 をご参照ください。

  • Snowflake が管理する Iceberg テーブルが同期する Open Catalog のカタログ統合名を確認するには、 SHOW ICEBERG TABLES コマンドを実行し、出力の catalog_sync_name 列をご参照ください。

ステップ6: Snowflake管理テーブルを作成する

CREATE ICEBERG TABLE (IcebergカタログとしてのSnowflake) コマンドを使用して、Snowflake管理のIcebergテーブルを作成します。

重要

オープンカタログのアクセス権限がテーブルに正しく適用されるようにするには、テーブルを作成する前に、そのテーブルが特定の条件を満たしていることを確認してください。これらの条件は、カタログのディレクトリ構造階層に関連しています。これらの条件および条件を満たす方法については、Snowflake Open Catalogドキュメントの カタログコンテンツを整理する の注記をご参照ください。

USE SCHEMA open_catalog;

CREATE OR REPLACE ICEBERG TABLE my_iceberg_table (col1 INT)
  CATALOG = 'SNOWFLAKE'
  EXTERNAL_VOLUME = 'my_external_volume';
Copy

前のステートメントの例で使用した BASE_LOCATION_PREFIX (my-open-catalog-tables) とテーブル名 (my_iceberg_table) について、Snowflake はテーブルファイルを次のパスに書き込みます。

  • STORAGE_BASE_URL/my-open-catalog-tables/my_iceberg_table.randomId/data/

  • STORAGE_BASE_URL/my-open-catalog-tables/my_iceberg_table.randomId/metadata/

Snowflakeでテーブルを変更すると、その変更は Open Catalog アカウントの外部カタログと自動的に同期されます。Apache Spark™のような他のエンジンは、 Open Catalog に接続することで、テーブルをクエリすることができます。

Snowflake 管理テーブルの作成に関する問題のトラブルシューティングについては、 Snowflake管理テーブルが作成できない をご参照ください。