ClickHouse は、複数のカタログ (Unity、Glue、Polaris など) とのインテグレーションをサポートしています。このガイドでは、ClickHouse と Unity Catalog を使用して、Databricks で管理されているデータをクエリする手順を説明します。
Databricks は、その lakehouse で複数のデータフォーマットをサポートしています。ClickHouse を使用すると、Unity Catalog のテーブルを Delta と Iceberg の両方の形式でクエリできます。
この機能は実験的であるため、以下を使用して有効にする必要があります。
SET allow_experimental_database_unity_catalog = 1;
ClickHouse が Unity Catalog と連携できるようにするには、外部リーダーによるアクセスを許可するよう Unity Catalog が設定されていることを確認する必要があります。これを行うには、「Unity Catalog への外部データアクセスを有効にする」ガイドに従ってください。
カタログの設定が完了したら、ClickHouse 用の認証情報を生成する必要があります。Unity との連携方法に応じて、使用する方法は 2 つあります。
-
Iceberg クライアントの場合は、サービスプリンシパルとして認証を使用します。
-
Delta クライアントの場合は、Personal Access Token (PAT) を使用します。
読み取りアクセスに PAT を使用する場合、トークンには ClickHouse が Unity Catalog のメタデータを一覧取得および読み取りできる権限が必要です。PAT には少なくとも、EXTERNAL USE SCHEMA の権限に加え、テーブルに対する SELECT 権限、親カタログに対する USE CATALOG、および親スキーマに対する USE SCHEMA が付与されていることを確認してください。
Unity Catalog と ClickHouse 間の接続を作成する
Unity Catalog の設定と認証の準備が完了したら、ClickHouse と Unity Catalog 間の接続を確立します。
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'
管理対象の Iceberg テーブルにアクセスするには:
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'
ClickHouse を使用して Unity Catalog のテーブルをクエリする
接続の準備ができたので、Unity Catalog 経由でクエリを実行できます。たとえば、次のようになります。
┌─name───────────────────────────────────────────────┐
│ clickbench.delta_hits │
│ demo.fake_user │
│ information_schema.catalog_privileges │
│ information_schema.catalog_tags │
│ information_schema.catalogs │
│ information_schema.check_constraints │
│ information_schema.column_masks │
│ information_schema.column_tags │
│ information_schema.columns │
│ information_schema.constraint_column_usage │
│ information_schema.constraint_table_usage │
│ information_schema.information_schema_catalog_name │
│ information_schema.key_column_usage │
│ information_schema.parameters │
│ information_schema.referential_constraints │
│ information_schema.routine_columns │
│ information_schema.routine_privileges │
│ information_schema.routines │
│ information_schema.row_filters │
│ information_schema.schema_privileges │
│ information_schema.schema_tags │
│ information_schema.schemata │
│ information_schema.table_constraints │
│ information_schema.table_privileges │
│ information_schema.table_tags │
│ information_schema.tables │
│ information_schema.views │
│ information_schema.volume_privileges │
│ information_schema.volume_tags │
│ information_schema.volumes │
│ uniform.delta_hits │
└────────────────────────────────────────────────────┘
┌─name───────────────┐
│ uniform.delta_hits │
└────────────────────┘
テーブルに対してクエリを実行するには:
SELECT count(*) FROM `uniform.delta_hits`
バッククォートが必要ClickHouse は複数のネームスペースをサポートしていないため、バッククォートが必要です。
テーブルの DDL を確認するには:
SHOW CREATE TABLE `uniform.delta_hits`
CREATE TABLE unity_uniform.`uniform.delta_hits`
(
`WatchID` Int64,
`JavaEnable` Int32,
`Title` String,
`GoodEvent` Int32,
`EventTime` DateTime64(6, 'UTC'),
`EventDate` Date,
`CounterID` Int32,
`ClientIP` Int32,
...
`FromTag` String,
`HasGCLID` Int32,
`RefererHash` Int64,
`URLHash` Int64,
`CLID` Int32
)
ENGINE = Iceberg('s3://<path>);
データレイクからClickHouseにデータを読み込む
DatabricksからClickHouseにデータを読み込む必要がある場合は、まずローカルのClickHouseテーブルを作成します。
CREATE TABLE hits
(
`WatchID` Int64,
`JavaEnable` Int32,
`Title` String,
`GoodEvent` Int32,
`EventTime` DateTime64(6, 'UTC'),
`EventDate` Date,
`CounterID` Int32,
`ClientIP` Int32,
...
`FromTag` String,
`HasGCLID` Int32,
`RefererHash` Int64,
`URLHash` Int64,
`CLID` Int32
)
PRIMARY KEY (CounterID, EventDate, UserID, EventTime, WatchID);
次に、INSERT INTO SELECT を使って Unity Catalog のテーブルからデータを読み込みます:
INSERT INTO hits SELECT * FROM unity_uniform.`uniform.delta_hits`;