メインコンテンツへスキップ
メインコンテンツへスキップ

データレイクの利用開始

TL;DR

データレイクテーブルへのクエリ、MergeTree による高速化、結果の Iceberg への書き戻しを、実際に手を動かしながら学べるガイドです。すべての手順で公開データセットを使用し、Cloud と OSS の両方で動作します。

このガイドのスクリーンショットは、ClickHouse Cloud の SQL コンソールから取得したものです。すべてのクエリは、Cloud とセルフマネージド環境の両方で動作します。

Icebergデータを直接クエリする

最も手軽に始める方法は、icebergS3() テーブル関数を使用することです。S3 上の Iceberg テーブルを指定するだけで、セットアップ不要でクエリをすぐに実行できます。

スキーマを確認する:

DESCRIBE icebergS3('https://datasets-documentation.s3.amazonaws.com/lake_formats/iceberg/')

クエリを実行します:

SELECT
    url,
    count() AS cnt
FROM icebergS3('https://datasets-documentation.s3.amazonaws.com/lake_formats/iceberg/')
GROUP BY url
ORDER BY cnt DESC
LIMIT 5
Iceberg クエリ

ClickHouse は Iceberg のメタデータを S3 から直接読み取り、スキーマを自動的に推論します。同じアプローチは deltaLake()hudi()paimon() にも適用できます。

詳細情報: オープンテーブルフォーマットへの直接クエリでは、4つのフォーマットすべて、分散読み取り用のクラスターバリアント、ストレージバックエンドオプション (S3、Azure、HDFS、ローカル) について説明しています。

永続テーブルエンジンの作成

繰り返しアクセスする場合は、Icebergテーブルエンジンを使用してテーブルを作成しておくと、毎回パスを指定する必要がなくなります。データはS3に保持され、複製は発生しません:

CREATE TABLE hits_iceberg
    ENGINE = IcebergS3('https://datasets-documentation.s3.amazonaws.com/lake_formats/iceberg/')

他の ClickHouse テーブルと同様にクエリを実行できます:

SELECT
    url,
    count() AS cnt
FROM hits_iceberg
GROUP BY url
ORDER BY cnt DESC
LIMIT 5
Icebergのクエリ

テーブルエンジンは、データキャッシュ、メタデータキャッシュ、スキーマ進化、およびタイムトラベルをサポートしています。テーブルエンジンの機能の詳細については直接クエリするガイドを、全機能の比較についてはサポートマトリックスを参照してください。

カタログへの接続

多くの組織では、テーブルのメタデータとデータディスカバリーを一元管理するために、データカタログを通じてIcebergテーブルを管理しています。ClickHouseは、DataLakeCatalogデータベースエンジンを使用してカタログへの接続をサポートしており、すべてのカタログテーブルをClickHouseデータベースとして公開します。これはよりスケーラブルなアプローチであり、新しいIcebergテーブルが作成された場合でも、追加の作業なしに常にClickHouseからアクセスできます。

以下は AWS Glue への接続例です:

CREATE DATABASE my_lake
ENGINE = DataLakeCatalog
SETTINGS
    catalog_type = 'glue',
    region = '<your-region>',
    aws_access_key_id = '<your-access-key>',
    aws_secret_access_key = '<your-secret-key>'

各カタログタイプには固有の接続設定が必要です。サポートされているカタログの完全なリストと設定オプションについては、カタログガイドを参照してください。

テーブルの参照とクエリの実行:

SHOW TABLES FROM my_lake;
SELECT count(*) FROM my_lake.`<database>.<table>`
注記

ClickHouseはネイティブで複数のネームスペースをサポートしていないため、<database>.<table>はバッククォートで囲む必要があります。

詳細情報: データカタログへの接続では、DeltaおよびIcebergの例を使用したUnity Catalogの完全なセットアップ手順を説明しています。

クエリを実行する

上記のいずれの方法 (テーブル関数、テーブルエンジン、またはカタログ) を使用した場合でも、同じ ClickHouse SQL をすべてに対して使用できます。

-- Table function
SELECT url, count() AS cnt
FROM icebergS3('https://datasets-documentation.s3.amazonaws.com/lake_formats/iceberg/')
GROUP BY url ORDER BY cnt DESC LIMIT 5

-- Table engine
SELECT url, count() AS cnt
FROM hits_iceberg
GROUP BY url ORDER BY cnt DESC LIMIT 5

-- Catalog
SELECT url, count() AS cnt
FROM my_lake.`<database>.<table>`
GROUP BY url ORDER BY cnt DESC LIMIT 5

クエリの構文は同一で、変わるのは FROM 句のみです。ClickHouse のすべての SQL 関数、結合、集計は、データソースに関わらず同じように動作します。

サブセットをClickHouseに読み込む

Icebergに直接クエリを実行するのは手軽ですが、パフォーマンスはネットワークスループットとファイルレイアウトに依存します。分析ワークロードには、ネイティブのMergeTreeテーブルにデータをロードすることを推奨します。

まず、ベースラインを取得するために、Icebergテーブルに対してフィルタリングクエリを実行します。

SELECT
    url,
    count() AS cnt
FROM hits_iceberg
WHERE counterid = 38
GROUP BY url
ORDER BY cnt DESC
LIMIT 5

このクエリは、Icebergがcounteridフィルターを認識しないため、S3内のデータセット全体をスキャンします。完了まで数秒かかることを想定してください。

Icebergクエリ

次に、MergeTreeテーブルを作成してデータをロードします:

CREATE TABLE hits_clickhouse
(
    url String,
    eventtime DateTime,
    counterid UInt32
)
ENGINE = MergeTree()
ORDER BY (counterid, eventtime);
INSERT INTO hits_clickhouse
SELECT url, eventtime, counterid
FROM hits_iceberg

MergeTreeテーブルに対して同じクエリを再実行します:

SELECT
    url,
    count() AS cnt
FROM hits_clickhouse
WHERE counterid = 38
GROUP BY url
ORDER BY cnt DESC
LIMIT 5
ClickHouse クエリ

counteridORDER BY キーの最初のカラムであるため、ClickHouse のスパース主索引は関連するグラニュールに直接スキップします — 1億行すべてをスキャンする代わりに、counterid = 38 の行のみを読み取ります。その結果、処理速度が大幅に向上します。

分析の高速化ガイドでは、LowCardinality型、全文インデックス、最適化された順序付けキーを活用してさらに踏み込んだ内容を扱っており、2億8,300万行のデータセットで約40倍のパフォーマンス向上を実証しています。

詳細情報: MergeTreeによる分析の高速化では、スキーマの最適化、全文索引、および改善前後の包括的なパフォーマンス比較について説明しています。

Icebergへの書き込み

ClickHouseはIcebergテーブルへのデータの書き戻しも可能で、リバースETLワークフローを実現します。集計結果やサブセットを他のツール (Spark、Trino、DuckDBなど) が利用できる形式で公開することができます。

出力用のIcebergテーブルを作成します:

CREATE TABLE output_iceberg
(
    url String,
    cnt UInt64
)
ENGINE = IcebergS3('https://your-bucket.s3.amazonaws.com/output/', 'access_key', 'secret_key')

集計結果の書き込み:

SET allow_experimental_insert_into_iceberg = 1;

INSERT INTO output_iceberg
SELECT
    url,
    count() AS cnt
FROM hits_clickhouse
GROUP BY url
ORDER BY cnt DESC

作成されたIcebergテーブルは、Iceberg互換の任意のエンジンから読み取ることができます。

詳細情報: オープンテーブルフォーマットへのデータ書き込みでは、UK Price Paid データセットを使用した生データおよび集計結果の書き込みについて説明しています。ClickHouse の型を Iceberg にマッピングする際のスキーマの考慮事項についても取り上げています。

次のステップ

ここまででワークフロー全体を確認できたので、各項目をさらに詳しく見ていきましょう。