ClickHouse は、Horizon が提供する Iceberg REST API (Apache Polaris を基盤とする) を介して、Snowflake Horizon Catalogに接続できます。
これにより、catalog_type = 'horizon' を指定した DataLakeCatalog データベースエンジンを使用して、ClickHouse から Snowflake 管理の Iceberg テーブルの読み取りと書き込みを行えます。
Horizon は Snowflake Open Catalog / セルフホスト型 Polaris と関連していますが、同じものではありません。
Open Catalog / Polaris (catalog_type = 'rest') |
Horizon (catalog_type = 'horizon') |
|
|---|---|---|
| エンドポイント | Open Catalog またはセルフホスト型 Polaris の URI | https://<org>-<account>.snowflakecomputing.com/polaris/api/catalog |
| ウェアハウス | Polaris カタログ / ウェアハウス名 | Snowflake データベース名 (通常は大文字) |
| 認証スコープ | PRINCIPAL_ROLE:ALL (一般的) |
session:role:<ROLE> |
| 認証情報 | client_id:client_secret |
PAT またはキーペア JWT を catalog_credential として使用 (OAuth client_secret。':' で分割しない) 、または Bearer auth_header |
前提条件
- Snowflake 管理の Iceberg テーブルがある Snowflake アカウント
- Horizon Iceberg REST エンドポイント:
https://<organization>-<account>.snowflakecomputing.com/polaris/api/catalog - Iceberg テーブルに対する権限を持つ Snowflake ロール (INSERT を実行する場合は書き込み権限も必要)
- 以下のいずれかによる認証:
- プログラムによるアクセストークン (PAT)
- アクセストークンと交換するキーペア JWT
- 外部 OAuth アクセストークン (Bearer
auth_headerとして使用)
- ClickHouse からアクセス可能なオブジェクトストレージ (Snowflake から提供される認証情報を推奨)
- DataLakeCatalog の Iceberg サポートを備えた ClickHouse
接続を作成する
オプション A: プログラムによるアクセストークン (推奨)
SET allow_experimental_database_iceberg = 1;
CREATE DATABASE horizon_catalog
ENGINE = DataLakeCatalog('https://<org>-<account>.snowflakecomputing.com/polaris/api/catalog')
SETTINGS
catalog_type = 'horizon',
warehouse = 'ICEBERG_TEST_DB',
catalog_credential = '<PAT>',
auth_scope = 'session:role:DATA_ENGINEER',
oauth_server_uri = 'https://<org>-<account>.snowflakecomputing.com/polaris/api/catalog/v1/oauth/tokens',
vended_credentials = 1;warehouse には、Snowflake 仮想ウェアハウスではなく、Snowflake データベース名を指定する必要があります。
引用符で囲まれていない Snowflake 識別子は大文字で扱われます。
オプション B: 事前に交換した Bearer アクセストークン
CREATE DATABASE horizon_catalog
ENGINE = DataLakeCatalog('https://<org>-<account>.snowflakecomputing.com/polaris/api/catalog')
SETTINGS
catalog_type = 'horizon',
warehouse = 'ICEBERG_TEST_DB',
auth_header = 'Authorization: Bearer <ACCESS_TOKEN>',
vended_credentials = 1;Icebergテーブルのクエリ
USE horizon_catalog;
SHOW TABLES;
SELECT count(*) FROM `PUBLIC.test_table`;
SHOW CREATE TABLE `PUBLIC.test_table`;書き込みパス
INSERT/UPDATE/DELETE (テーブル作成時は CREATE ICEBERG TABLE) の権限を持つロールを使用すると、 ClickHouse は同じカタログを介して書き込めます。
-- Insert into an existing Snowflake-managed Iceberg table
INSERT INTO horizon_catalog.`PUBLIC.test_table`
SELECT
number AS id,
concat('name_', toString(number)) AS name
FROM numbers(100);
-- Create a new Iceberg table in the Horizon catalog (requires CREATE ICEBERG TABLE)
CREATE TABLE horizon_catalog.`PUBLIC.clickhouse_written`
(
id Int64,
name String
)
ENGINE = Iceberg;CREATE TABLE の正確な構文は、ご使用のバージョンでの REST カタログに対する ClickHouse Iceberg / DataLakeCatalog の書き込みサポートに従います。Snowflake の権限不足は、カタログの HTTP エラーとして報告されます。
MergeTree へのロード
CREATE TABLE my_clickhouse_table
(
id Int64,
name String
)
ENGINE = MergeTree
ORDER BY id;
INSERT INTO my_clickhouse_table
SELECT * FROM horizon_catalog.`PUBLIC.test_table`;