0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Snowflake Open Catalog 公式ドキュメントの迷いポイント(言葉の揺らぎなど)

Last updated at Posted at 2026-01-06

Open Catalog の公式ドキュメントを読む上で、用語の統一がされておらず、読解に時間を要した。
迷ったポイントを、この記事で取り上げる。

読解のきっかけ

以下の確証を得ること。念のため、Snowflakeのサポートにも確認済み。

「Open CatalogのInternalタイプでカタログを構成すれば、Snowflakeに限らずIceberg Catalog REST API互換の外部エンジンから読み・書きできることが可能」

「外部」「内部」という言葉は、どの立場でカタログを見るかで逆転する

Snowflake の「外部」は Open Catalog の「内部」タイプである。

具体的には、

以下ドキュメント①(Snowflake)が言う「外部」は、「Snowflakeの外にカタログサーバー(REST API)が存在すること」を指しており、

公式ドキュメント①

Apache Iceberg™ テーブル

カタログオプション

Snowflakeは以下のIcebergカタログオプションをサポートしています。

https://docs.snowflake.com/ja/user-guide/tables-iceberg#catalog-options

以下ドキュメント②(Open Catalog)が言う「外部」タイプは、「Open Catalog以外で生成されたメタデータをインポート(Open Catalogへ同期)すること」を指す一方で、「内部(Internal)」は、Open CatalogがIcebergカタログとしてメタデータを管理することを指す。

公式ドキュメント②

Snowflakeオープンカタログの概要

カタログの種類

カタログは以下の2つの種類のいずれかになります。

  • Internal: The catalog is managed by Open Catalog. A third-party query engine can read and write to tables from this catalog. In addition, Snowflake can also read and write to tables from this catalog.
  • 外部:カタログは、他のIcebergカタログプロバイダー(例えば、Snowflake、Glue、Dremio Arctic)によって外部管理されています。このカタログからのテーブルはOpen Catalogに同期されます。これらのテーブルは、オープンカタログでは読み取り専用です。現在のリリースでは、Snowflakeの外部カタログのみが提供されています。

https://docs.snowflake.com/ja/user-guide/opencatalog/overview#catalog-types

定義の整理

メタデータ管理主体 Snowflake (Horizon)での呼称 Open Catalogでの呼称 仕組み DDLイメージ
Snowflake Internal (Managed Table) External Snowflakeがメタデータを生成し、Open Catalogへ同期(通知)する ICEBERG TABLE ... CATALOG = 'SNOWFLAKE'
Open Catalog External (Iceberg REST) Internal Open Catalogがメタデータを管理し、SnowflakeはREST API経由で参照する CATALOG INTEGRATION + LINKED_CATALOG

補足:外部(External)の用語比較

SnowflakeのDB用アカウント(ドキュメント①)の「SnowflakeをIcebergカタログとして使用」は、Open Catalog(ドキュメント②)の「外部(Extarnal)」のこと。

  • Snowflake-managed Icebergテーブル を Open Catalog に同期して見せる旨が説明されている。ドキュメント①表内にも、「カタログとしてSnowflakeを使用: Snowflakeで管理されたテーブルを Open Catalog と同期して、他のコンピュートエンジンを使ってテーブルをクエリすることができます。」と説明されている

補足:内部(Internal) の用語比較

SnowflakeのDB用アカウント(ドキュメント①)の「外部Icebergカタログを使用」は、Open Catalog(ドキュメント②)の「内部(Internal)」のこと

  • Open Catalog を外部カタログ(Iceberg REST)として参照するという旨が説明されている。ドキュメント①表内の「外部カタログの使用: Snowflakeを使用して、 Open Catalog で管理されているIcebergテーブルに対してクエリや書き込みを行うことができます。」と説明されている
  • なお、「現在のリリースでは、Snowflakeの外部カタログのみが提供されています。」という箇所でちょっとドキッとするが、Open Catalogとしての「内部(Internal)」カタログは作成可能。実際、カタログ作成時に設定可能な「External」というトグルスイッチをOFFのままにすれば、内部(Internal)として作成される。

Open Catalogが管理するテーブルへの書き込み可否の揺らぎ

Snowflake公式の Open Catalog ガイド側に、Snowflake は Open Catalog が管理するテーブルへは書き込めないという記述が残っている。

Snowflakeで Snowflake Open Catalog を使用して Apache Iceberg™ テーブルを使用する

テーブルアクセス

  • Open Catalog と同期したSnowflake管理Icebergテーブルは、 Open Catalog では読み取り専用です。
  • Snowflakeはクエリはできますが、 Open Catalog が管理するテーブルへの書き込みはできません。

その一方で、外部 Iceberg REST カタログ(例:Open Catalog を含む)に対して、catalog-linked DB 経由で書き込みができる旨も説明されている。

外部管理 Apache Iceberg™ テーブル テーブルへの書き込みサポートにより、外部Iceberg REST カタログで管理されているテーブルに対して書き込み操作を実行できます。
https://docs.snowflake.com/ja/user-guide/tables-iceberg-externally-managed-writes

Internal: The catalog is managed by Open Catalog. A third-party query engine can read and write to tables from this catalog. In addition, Snowflake can also read and write to tables from this catalog.
https://docs.snowflake.com/ja/user-guide/opencatalog/overview#catalog-types

上記読解による違いはあるものの、実際以下のようにした場合は、書き込みは可能。

-- カタログ統合
CREATE OR REPLACE CATALOG INTEGRATION open_catalog_int
  CATALOG_SOURCE = POLARIS
  TABLE_FORMAT = ICEBERG
  CATALOG_NAMESPACE= 'xxx_namespace'
  REST_CONFIG = (
    CATALOG_URI = 'https://xxx_open_catalog.snowflakecomputing.com/polaris/api/catalog'
    CATALOG_NAME = 'catalog-blob-endpoint'
    ACCESS_DELEGATION_MODE = EXTERNAL_VOLUME_CREDENTIALS

  )
  REST_AUTHENTICATION = (
    TYPE = OAUTH
    OAUTH_CLIENT_ID = '...'
    OAUTH_CLIENT_SECRET = '...'
    OAUTH_ALLOWED_SCOPES = ( '...' )
  )
  ENABLED = TRUE;

-- catalog-linked DB

CREATE OR REPLACE DATABASE iceberg_linked_db
  LINKED_CATALOG = (
    CATALOG = 'open_catalog_int'
    ALLOWED_WRITE_OPERATIONS = ...
  )
  EXTERNAL_VOLUME = '...'
  CATALOG_CASE_SENSITIVITY = CASE_SENSITIVE;

--- リンクDB配下でDDL

USE ROLE ...;
USE DATABASE iceberg_linked_db;
GRANT USAGE ON DATABASE iceberg_linked_db TO ROLE ...;
GRANT CREATE SCHEMA ON DATABASE iceberg_linked_db TO ROLE ...;
CREATE SCHEMA xxx_namespace;
USE SCHEMA xxx_namespace;
CREATE OR REPLACE ICEBERG TABLE xxx_table (col1 INT);

--- 参照確認用
INSERT INTO xxx_table VALUES (1);
SELECT * FROM xxx_table;

つまり、

  • Snowflake managedテーブルをOpen Catalogに見せるだけ=外部タイプのOpen Catalogの場合、一方向同期であるため、Open Catalog側からの書き込みは本質的に不可能(読み取り専用)
  • 一方、CATALOG_INTEGRATIONを介した内部タイプの方法では、Snowflakeは外部カタログに対する正当なライターとなり、DML(INSERT/UPDATE等)が実行可能と言えるように思う

外部(External)カタログの制限について

Open Catalogの「外部(External)」タイプは、ストレージへのアクセス権限、カタログへのアクセス権限をDB用のSnowflakeから抽象化・分離するような限定的なユースケースに絞られる。
というのも、このタイプは、Snowflake(Horizon Catalog)からのメタデータ同期に完全に依存しており、かつ、2025年11月のアップデート(Preview)により、Snowflake Horizon 自体が Iceberg REST カタログとして振る舞えるようになった。これにより、外部エンジンからSnowflake管理のIcebergテーブルを参照する際、Open Catalog(外部タイプ)を仲介させる必要性が失われつつあると思われるため(使いどころ難しい..)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?