spark_catalog であり、テーブルは {catalog name}.{database}.{table} で識別されます。新しい
カタログ機能により、1 つの Spark アプリケーションで複数のカタログを追加して利用できるようになりました。
Catalog API と TableProvider API の選び方
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
互換性マトリクス
インストールとセットアップ
pom.xml や SBT の build.sbt など) に依存関係として直接追加できます。
また、必要な JAR ファイルを $SPARK_HOME/jars/ フォルダーに配置するか、spark-submit コマンドで --jars フラグを使って Spark のオプションとして直接指定することもできます。
どちらの方法でも、ClickHouse Spark コネクタを Spark 環境で利用できるようになります。
依存関係として追加
- Maven
- Gradle
- SBT
- Spark SQL/Shell CLI
ライブラリをダウンロードする
カタログを登録する (必須)
これらの設定は、次のいずれかの方法で指定できます。
spark-defaults.confを編集または作成する。- 設定を
spark-submitコマンド (またはspark-shell/spark-sqlCLI コマンド) に渡す。 - コンテキストの初期化時に設定を追加する。
TableProvider API の使用 (フォーマットベースのアクセス)
フォーマットベースの読み取りの例
- Python
- Scala
- Java
フォーマットベースの書き込み例
- Python
- Scala
- Java
TableProvider API の機能
自動テーブル作成
- Engine: 指定しない場合は
MergeTree()がデフォルトで使用されます。engineオプションを使って別のエンジンを指定できます (例:ReplacingMergeTree(),SummingMergeTree()など) - ORDER BY: 必須 - 新しいテーブルを作成する際は、
order_byオプションを明示的に指定する必要があります。コネクタは、指定されたすべてのカラムがスキーマ内に存在することを検証します。 - Nullable Key Support: ORDER BY に Nullable カラムが含まれる場合は、自動的に
settings.allow_nullable_key=1を追加します
- Python
- Scala
- Java
TableProvider の接続オプション
接続オプション
テーブル作成オプション
- 新しいテーブルを作成する場合、
order_byオプションは必須です。指定するすべてのカラムはスキーマ内に存在している必要があります。 ** ORDER BY に Nullable カラムが含まれており、明示的に指定されていない場合は、自動的に1に設定されます。
書き込みモード
append: 既存のテーブルにデータを追加overwrite: テーブル内のすべてのデータを置き換える (テーブルを空にする)
- Python
- Scala
- Java
ClickHouse オプションの設定
allow_nullable_key、index_granularity、その他のテーブルレベルまたはクエリレベルの設定など、ClickHouse 固有の設定を構成できます。これらは、コネクタが ClickHouse に接続する方法を制御するコネクタ オプション (host、database、table など) とは異なります。
TableProvider API を使用する
settings.<key> 形式のオプションを使用します。
- Python
- Scala
- Java
Catalog API を使用する
spark.sql.catalog.<catalog_name>.option.<key> の形式を使用します。
ClickHouse Cloud の設定
データの読み取り
- Java
- Scala
- Python
- Spark SQL
データの書き込み
- Java
- Scala
- Python
- Spark SQL
DDL 操作
Spark SQL を使用する場合、一度に実行できるステートメントは 1 つだけです。
VariantType を扱う
VariantType のサポートは Spark 4.0+ で利用でき、Experimental な JSON/Variant 型を有効にした ClickHouse 25.3+ が必要です。
VariantType をサポートしています。VariantType は ClickHouse の JSON 型および Variant 型にマッピングされるため、柔軟なスキーマを持つデータを効率的に保存およびクエリできます。
このセクションでは、VariantType の型マッピングと使用方法に絞って説明します。サポートされているすべてのデータ型の概要については、サポートされているデータ型 セクションを参照してください。
ClickHouse 型マッピング
VariantType データの読み込み
JSON カラムと Variant カラムは自動的に Spark の VariantType にマッピングされます。
- Scala
- Python
- Java
VariantType データの書き込み
- Scala
- Python
- Java
Spark SQLでのVariantType テーブルの作成
Variant 型の設定
JSON 型 (デフォルト)
variant_types プロパティが指定されていない場合、このカラムはデフォルトで ClickHouse の JSON 型となり、JSON オブジェクトのみを受け付けます:
複数の型をサポートする Variant 型
variant_types プロパティに型を指定します。
サポートされている Variant 型
Variant() では、以下の ClickHouse 型を使用できます。
- プリミティブ:
String,Int8,Int16,Int32,Int64,UInt8,UInt16,UInt32,UInt64,Float32,Float64,Bool - 配列:
Array(T)(T は、ネストした配列を含む任意のサポート対象の型) - JSON: JSON オブジェクトを格納するための
JSON
読み取りフォーマットの設定
VariantType として読み取られます。これを上書きして、文字列として読み取ることもできます。
- Scala
- Python
- Java
書き込みフォーマットのサポート
書き込みフォーマットを設定します。
ベストプラクティス
- JSON 専用のデータには JSON 型を使用する: JSON object だけを保存する場合は、デフォルトの JSON 型 (
variant_typesプロパティなし) を使用します - 型を明示的に指定する:
Variant()を使用する場合は、保存する予定のすべての型を明示的に列挙します - 実験的機能を有効にする: ClickHouse で
allow_experimental_json_type = 1が有効になっていることを確認します - 書き込みには JSON フォーマットを使用する: 互換性を高めるため、VariantType データの書き込みには JSON フォーマットを使用することを推奨します
- クエリパターンを考慮する: JSON/Variant 型は、効率的にフィルタリングするための ClickHouse の JSON パスクエリをサポートしています
- パフォーマンス向上のためのカラムヒント: ClickHouse で JSON フィールドを使用する場合、カラムヒントを追加するとクエリのパフォーマンスが向上します。現在、Spark 経由でのカラムヒントの追加はサポートされていません。この機能の進捗状況は GitHub issue #497 を参照してください。
例: ワークフロー全体
- Scala
- Python
- Java
設定
設定の使用方法: これらは、Catalog API と TableProvider API の両方に適用される Spark レベルの設定オプションです。設定方法は 2 つあります。
-
グローバル Spark 設定 (すべての操作に適用) :
-
操作ごとの上書き (TableProvider API のみ。グローバル設定を上書き可能) :
spark-defaults.conf や Spark セッションの作成時に設定することもできます。