前のセクションでは、ストレージパスを直接指定してオープンテーブルフォーマットをクエリしました。実際には、ほとんどの組織がテーブルメタデータを データカタログ で管理しています。これは、テーブルの場所、スキーマ、パーティションを追跡するための中央レジストリです。DataLakeCatalog データベースエンジンを使って ClickHouse をカタログに接続すると、カタログ全体が ClickHouse データベースとして公開されます。カタログ内の各テーブルは自動的に表示され、完全な ClickHouse SQL でクエリできます。個々のテーブルパスを把握したり、テーブルごとに認証情報を管理したりする必要はありません。
このガイドでは、Databricks Unity カタログ への接続方法を説明します。ClickHouse は次のカタログにも対応しています。完全なセットアップ手順については、各リファレンスガイドを参照してください。
| カタログ | Reference guide |
|---|
| AWS Glue | AWS Glue カタログ |
| Iceberg REST Catalog | REST カタログ |
| Lakekeeper | Lakekeeper カタログ |
| Project Nessie | Nessie カタログ |
| Microsoft OneLake | Fabric OneLake |
ここでは例として、Unity Catalog を使用します。
Databricks Unity Catalog は、Databricks のレイクハウスデータに対する一元的なガバナンスを提供します。
Databricks は、レイクハウス向けに複数のデータフォーマットをサポートしています。ClickHouse では、Unity Catalog のテーブルを Delta と Iceberg の両方の形式でクエリできます。
Unity Catalog とのインテグレーションは、マネージドテーブルと外部テーブルで動作します。
このインテグレーションは現在、AWS でのみサポートされています。
ClickHouse が Unity Catalog とやり取りできるようにするには、外部リーダーとの連携を許可するように Unity Catalog が設定されていることを確認する必要があります。これは、「Unity Catalog への外部データアクセスを有効にする」ガイドに従うことで行えます。
外部アクセスを有効にするだけでなく、インテグレーションを設定するプリンシパルに、テーブルを含むスキーマに対する EXTERNAL USE SCHEMA 権限が付与されていることも確認してください。
カタログの設定が完了したら、ClickHouse 用の認証情報を生成する必要があります。Unity との連携方法に応じて、使用できる方法は 2 つあります。
-
Iceberg クライアントの場合は、サービスプリンシパルで認証します。
-
Delta クライアントの場合は、Personal Access Token (PAT) を使用します。
認証情報を使用して、該当するエンドポイントに接続し、Iceberg または Delta テーブルをクエリできます。
Delta フォーマットのデータにアクセスするには、Unity Catalog を使用します。SET allow_experimental_database_unity_catalog = 1;
CREATE DATABASE unity
ENGINE = DataLakeCatalog('https://<workspace-id>.cloud.databricks.com/api/2.1/unity-catalog')
SETTINGS warehouse = 'CATALOG_NAME', catalog_credential = '<PAT>', catalog_type = 'unity';
SET allow_database_iceberg = 1;
CREATE DATABASE unity
ENGINE = DataLakeCatalog('https://<workspace-id>.cloud.databricks.com/api/2.1/unity-catalog/iceberg-rest')
SETTINGS catalog_type = 'rest', catalog_credential = '<client-id>:<client-secret>', warehouse = 'workspace',
oauth_server_uri = 'https://<workspace-id>.cloud.databricks.com/oidc/v1/token', auth_scope = 'all-apis,sql';
カタログへの接続が完了したら、テーブルを一覧表示できます。
┌─name───────────────────────────────────────────────┐
│ unity.logs │
│ unity.single_day_log │
└────────────────────────────────────────────────────┘
31 rows in set.
標準の SHOW CREATE TABLE コマンドを使用すると、テーブルの作成方法を確認できます。
バッククォートが必要ネームスペースとテーブル名は、バッククォートで囲んで指定する必要があります。ClickHouse は複数のネームスペースには対応していません。
以下では、REST Iceberg カタログに対してクエリを実行することを前提としています。
SHOW CREATE TABLE unity.`icebench.single_day_log`
CREATE TABLE unity.`icebench.single_day_log`
(
`pull_request_number` Nullable(Int64),
`commit_sha` Nullable(String),
`check_start_time` Nullable(DateTime64(6, 'UTC')),
`check_name` Nullable(String),
`instance_type` Nullable(String),
`instance_id` Nullable(String),
`event_date` Nullable(Date32),
`event_time` Nullable(DateTime64(6, 'UTC')),
`event_time_microseconds` Nullable(DateTime64(6, 'UTC')),
`thread_name` Nullable(String),
`thread_id` Nullable(Decimal(20, 0)),
`level` Nullable(String),
`query_id` Nullable(String),
`logger_name` Nullable(String),
`message` Nullable(String),
`revision` Nullable(Int64),
`source_file` Nullable(String),
`source_line` Nullable(Decimal(20, 0)),
`message_format_string` Nullable(String)
)
ENGINE = Iceberg('s3://...')
ClickHouse のすべての関数を使用できます。繰り返しになりますが、ネームスペースとテーブル名はバッククォートで囲む必要があります。
SELECT count()
FROM unity.`icebench.single_day_log`
┌───count()─┐
│ 282634391 │ -- 2億8263万
└───────────┘
1 row in set. Elapsed: 1.265 sec.
詳しいセットアップ手順については、Unity Catalog リファレンスガイドを参照してください。