Skip to main content
このコネクタは、高度なパーティション化や述語プッシュダウンなどの ClickHouse 固有の最適化を活用して、 クエリ性能とデータ処理を向上させます。 このコネクタは ClickHouse 公式の JDBC コネクタ をベースとしており、 独自のカタログを管理します。 Spark 3.0 より前は、Spark には組み込みのカタログという概念がなかったため、ユーザーは通常、 Hive Metastore や AWS Glue などの外部カタログシステムを利用していました。 これらの外部ソリューションでは、Spark からアクセスする前に、データソースのテーブルを手動で登録する必要がありました。 しかし、Spark 3.0 でカタログの概念が導入されたことで、Spark は カタログプラグインを登録するだけでテーブルを自動的に検出できるようになりました。 Spark のデフォルトカタログは spark_catalog であり、テーブルは {catalog name}.{database}.{table} で識別されます。新しい カタログ機能により、1 つの Spark アプリケーションで複数のカタログを追加して利用できるようになりました。

Catalog API と TableProvider API の選び方

ClickHouse Spark コネクタは、Catalog APITableProvider API (フォーマットベースのアクセス) という 2 つのアクセスパターンをサポートしています。その違いを理解することで、ユースケースに適したアプローチを選べます。

Catalog API と TableProvider API の比較

要件

  • Java 8 または 17 (Spark 4.0 では Java 17 以降が必要)
  • Scala 2.12 または 2.13 (Spark 4.0 は Scala 2.13 のみをサポート)
  • Apache Spark 3.3、3.4、3.5、または 4.0

互換性マトリクス

インストールとセットアップ

ClickHouse を Spark と統合するには、プロジェクト構成に応じて複数のインストール方法を選択できます。 ClickHouse Spark コネクタは、プロジェクトのビルドファイル (Maven の pom.xml や SBT の build.sbt など) に依存関係として直接追加できます。 また、必要な JAR ファイルを $SPARK_HOME/jars/ フォルダーに配置するか、spark-submit コマンドで --jars フラグを使って Spark のオプションとして直接指定することもできます。 どちらの方法でも、ClickHouse Spark コネクタを Spark 環境で利用できるようになります。

依存関係として追加

SNAPSHOT バージョンを使用する場合は、次のリポジトリを追加します。

ライブラリをダウンロードする

バイナリJARの命名パターンは次のとおりです。
利用可能なリリース済み JAR ファイルはすべて Maven Central Repository で入手でき、日次ビルドの SNAPSHOT JAR ファイルはすべて Sonatype OSS Snapshots Repository で入手できます。
コネクタは clickhouse-httpclickhouse-client に依存しており、これらはどちらも clickhouse-jdbc:all に含まれているため、“all” classifier を指定した clickhouse-jdbc JAR を含めることが重要です。 また、完全な JDBC パッケージを使用したくない場合は、 clickhouse-client JARclickhouse-http を個別に追加することもできます。いずれの場合も、パッケージのバージョンに互換性があることを 互換性マトリクス に従って確認してください。

カタログを登録する (必須)

ClickHouse のテーブルにアクセスするには、以下の設定で新しい Spark カタログを構成する必要があります。 これらの設定は、次のいずれかの方法で指定できます。
  • spark-defaults.conf を編集または作成する。
  • 設定を spark-submit コマンド (または spark-shell / spark-sql CLI コマンド) に渡す。
  • コンテキストの初期化時に設定を追加する。
ClickHouse クラスターを使用する場合は、各インスタンスごとに一意のカタログ名を設定する必要があります。 例:
このように設定すると、Spark SQL から clickhouse1 のテーブル <ck_db>.<ck_table> には clickhouse1.<ck_db>.<ck_table> でアクセスでき、clickhouse2 のテーブル <ck_db>.<ck_table> には clickhouse2.<ck_db>.<ck_table> でアクセスできます。

TableProvider API の使用 (フォーマットベースのアクセス)

カタログベースの方法に加え、ClickHouse Spark コネクタは、TableProvider API を通じた フォーマットベースのアクセス方式 もサポートしています。

フォーマットベースの読み取りの例

フォーマットベースの書き込み例

TableProvider API の機能

TableProvider API には、便利な機能がいくつか用意されています。

自動テーブル作成

存在しないテーブルに書き込むと、コネクタが適切なスキーマでそのテーブルを自動的に作成します。コネクタには、適切なデフォルト設定が用意されています。
  • Engine: 指定しない場合は MergeTree() がデフォルトで使用されます。engine オプションを使って別のエンジンを指定できます (例: ReplacingMergeTree(), SummingMergeTree() など)
  • ORDER BY: 必須 - 新しいテーブルを作成する際は、order_by オプションを明示的に指定する必要があります。コネクタは、指定されたすべてのカラムがスキーマ内に存在することを検証します。
  • Nullable Key Support: ORDER BY に Nullable カラムが含まれる場合は、自動的に settings.allow_nullable_key=1 を追加します
ORDER BY 必須: TableProvider API 経由で新しいテーブルを作成する場合、order_by オプションは必須です。ORDER BY 句に使用するカラムを明示的に指定する必要があります。コネクタは、指定されたすべてのカラムがスキーマ内に存在することを検証し、いずれかのカラムが不足している場合はエラーを返します。Engine の選択: デフォルトのエンジンは MergeTree() ですが、engine オプションを使用して任意の ClickHouse テーブルエンジンを指定できます (例: ReplacingMergeTree(), SummingMergeTree(), AggregatingMergeTree() など) 。

TableProvider の接続オプション

フォーマットベースの API を使用する場合は、次の接続オプションを利用できます。

接続オプション

テーブル作成オプション

これらのオプションは、テーブルが存在せず、新たに作成する必要がある場合に使用します。
  • 新しいテーブルを作成する場合、order_by オプションは必須です。指定するすべてのカラムはスキーマ内に存在している必要があります。 ** ORDER BY に Nullable カラムが含まれており、明示的に指定されていない場合は、自動的に 1 に設定されます。
ベストプラクティス: ClickHouse Cloud では、ORDER BY のカラムが Nullable になる可能性がある場合は、settings.allow_nullable_key=1 を明示的に設定してください。ClickHouse Cloud ではこの設定が必要です。

書き込みモード

Spark コネクタ (TableProvider API と Catalog API の両方) は、以下の Spark 書き込みモードをサポートしています。
  • append: 既存のテーブルにデータを追加
  • overwrite: テーブル内のすべてのデータを置き換える (テーブルを空にする)
パーティション単位の上書きはサポートされていません: このコネクタは現在、パーティションレベルの上書き操作 (例: partitionBy を使用した overwrite モード) をサポートしていません。この機能は現在開発中です。進捗については、GitHub issue #34 を参照してください。

ClickHouse オプションの設定

Catalog API と TableProvider API はどちらも、ClickHouse 固有のオプション (コネクタのオプションではなく) を設定できます。これらのオプションは、テーブルの作成時やクエリの実行時に ClickHouse に渡されます。 ClickHouse オプションを使用すると、allow_nullable_keyindex_granularity、その他のテーブルレベルまたはクエリレベルの設定など、ClickHouse 固有の設定を構成できます。これらは、コネクタが ClickHouse に接続する方法を制御するコネクタ オプション (hostdatabasetable など) とは異なります。

TableProvider API を使用する

TableProvider API では、settings.<key> 形式のオプションを使用します。

Catalog API を使用する

Catalog API を使用する場合は、Spark の設定で spark.sql.catalog.<catalog_name>.option.<key> の形式を使用します。
または、Spark SQL でテーブルを作成する際に設定することもできます:

ClickHouse Cloud の設定

ClickHouse Cloud に接続する際は、SSL を有効にし、適切な SSL モードを設定してください。たとえば、次のようにします。

データの読み取り

データの書き込み

パーティションの上書きはサポートされていません: Catalog API は現在、パーティション単位の上書き操作 (例: partitionBy を使用する overwrite モード) をサポートしていません。この機能は現在開発中です。進捗状況については、GitHub issue #34 を参照してください。

DDL 操作

Spark SQL を使用すると、ClickHouse インスタンスに対して DDL 操作を実行でき、すべての変更は即座に ClickHouse に永続化されます。 Spark SQL では、ClickHouse とまったく同じようにクエリを記述できるため、 たとえば CREATE TABLE や TRUNCATE などのコマンドも、変更を加えることなく直接実行できます。
Spark SQL を使用する場合、一度に実行できるステートメントは 1 つだけです。
上記の例は Spark SQL クエリを示しています。これらのクエリは、Java、Scala、 PySpark、またはシェルなど、任意の API を使ってアプリケーション内で実行できます。

VariantType を扱う

VariantType のサポートは Spark 4.0+ で利用でき、Experimental な JSON/Variant 型を有効にした ClickHouse 25.3+ が必要です。
このコネクタは、半構造化データを扱うための Spark の VariantType をサポートしています。VariantType は ClickHouse の JSON 型および Variant 型にマッピングされるため、柔軟なスキーマを持つデータを効率的に保存およびクエリできます。
このセクションでは、VariantType の型マッピングと使用方法に絞って説明します。サポートされているすべてのデータ型の概要については、サポートされているデータ型 セクションを参照してください。

ClickHouse 型マッピング

VariantType データの読み込み

ClickHouse から読み込む際、JSON カラムと Variant カラムは自動的に Spark の VariantType にマッピングされます。

VariantType データの書き込み

JSON または Variant カラム型を使用して、VariantType データを ClickHouse に書き込めます。

Spark SQLでのVariantType テーブルの作成

Spark SQL の DDL を使用して、VariantType テーブルを作成できます。

Variant 型の設定

VariantType カラムを含むテーブルを作成する際は、使用する ClickHouse の型を指定できます。

JSON 型 (デフォルト)

variant_types プロパティが指定されていない場合、このカラムはデフォルトで ClickHouse の JSON 型となり、JSON オブジェクトのみを受け付けます:
これにより、次の ClickHouse クエリが生成されます。

複数の型をサポートする Variant 型

プリミティブ、Array、JSON オブジェクトをサポートするには、variant_types プロパティに型を指定します。
これにより、次の ClickHouse クエリが生成されます:

サポートされている Variant 型

Variant() では、以下の ClickHouse 型を使用できます。
  • プリミティブ: String, Int8, Int16, Int32, Int64, UInt8, UInt16, UInt32, UInt64, Float32, Float64, Bool
  • 配列: Array(T) (T は、ネストした配列を含む任意のサポート対象の型)
  • JSON: JSON オブジェクトを格納するための JSON

読み取りフォーマットの設定

デフォルトでは、JSON および Variant カラムは VariantType として読み取られます。これを上書きして、文字列として読み取ることもできます。

書き込みフォーマットのサポート

VariantType の書き込みサポートは、フォーマットによって異なります。 書き込みフォーマットを設定します。
ClickHouse の Variant 型に書き込む必要がある場合は、JSONフォーマットを使用してください。Arrow フォーマットでは、JSON 型にしか書き込めません。

ベストプラクティス

  1. JSON 専用のデータには JSON 型を使用する: JSON object だけを保存する場合は、デフォルトの JSON 型 (variant_types プロパティなし) を使用します
  2. 型を明示的に指定する: Variant() を使用する場合は、保存する予定のすべての型を明示的に列挙します
  3. 実験的機能を有効にする: ClickHouse で allow_experimental_json_type = 1 が有効になっていることを確認します
  4. 書き込みには JSON フォーマットを使用する: 互換性を高めるため、VariantType データの書き込みには JSON フォーマットを使用することを推奨します
  5. クエリパターンを考慮する: JSON/Variant 型は、効率的にフィルタリングするための ClickHouse の JSON パスクエリをサポートしています
  6. パフォーマンス向上のためのカラムヒント: ClickHouse で JSON フィールドを使用する場合、カラムヒントを追加するとクエリのパフォーマンスが向上します。現在、Spark 経由でのカラムヒントの追加はサポートされていません。この機能の進捗状況は GitHub issue #497 を参照してください。

例: ワークフロー全体

設定

以下は、コネクタで利用可能な調整可能な設定です。
設定の使用方法: これらは、Catalog API と TableProvider API の両方に適用される Spark レベルの設定オプションです。設定方法は 2 つあります。
  1. グローバル Spark 設定 (すべての操作に適用) :
  2. 操作ごとの上書き (TableProvider API のみ。グローバル設定を上書き可能) :
また、spark-defaults.conf や Spark セッションの作成時に設定することもできます。

サポートされているデータ型

このセクションでは、Spark と ClickHouse 間のデータ型の対応関係を概説します。以下の表は、ClickHouse から Spark にデータを読み込む場合と、Spark から ClickHouse にデータを挿入する場合のデータ型変換をすばやく参照できる一覧です。

ClickHouse から Spark へのデータの読み込み

Spark から ClickHouse へのデータ挿入

コントリビューションとサポート

プロジェクトへのコントリビューションや問題の報告をご希望の場合は、ぜひご協力ください。 issue の起票、改善の提案、またはプルリクエストの送信は、GitHub リポジトリから行えます。 コントリビューションを歓迎します。作業を始める前に、リポジトリ内のコントリビューションガイドラインをご確認ください。 ClickHouse Spark コネクタの改善にご協力いただき、ありがとうございます!
最終更新日 2026年7月3日