Перейти к основному содержанию
Этот коннектор использует оптимизации ClickHouse, такие как расширенное партиционирование и pushdown предикатов, чтобы повысить производительность запросов и эффективность обработки данных. Коннектор основан на официальном коннекторе JDBC для ClickHouse и управляет собственным каталогом. До Spark 3.0 в Spark не было встроенной концепции каталога, поэтому пользователи обычно полагались на внешние системы каталогов, такие как Hive Metastore или AWS Glue. При использовании этих внешних решений пользователям приходилось вручную регистрировать таблицы источников данных, прежде чем работать с ними в Spark. Однако в Spark 3.0 появилась концепция каталога, и теперь Spark может автоматически обнаруживать таблицы при регистрации плагинов каталогов. Каталогом по умолчанию в Spark является spark_catalog, а таблицы идентифицируются как {catalog name}.{database}.{table}. Благодаря этой возможности теперь можно добавлять и использовать несколько каталогов в одном приложении Spark.

Выбор между Catalog API и TableProvider API

Коннектор ClickHouse Spark поддерживает два варианта доступа: Catalog API и TableProvider API (доступ на основе формата). Понимание различий между ними поможет выбрать подходящий вариант для вашего сценария использования.

Catalog API vs 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 как зависимость напрямую в файл сборки проекта (например, в pom.xml для Maven или build.sbt для SBT). Либо можно поместить необходимые JAR-файлы в каталог $SPARK_HOME/jars/ или передать их напрямую как параметр Spark с помощью флага --jars в команде spark-submit. Оба подхода позволяют сделать коннектор ClickHouse доступным в вашей среде Spark.

Импорт в качестве зависимости

Добавьте следующий репозиторий, если хотите использовать версию SNAPSHOT.

Скачайте библиотеку

Имя бинарного JAR-файла соответствует следующему шаблону:
Все доступные выпущенные JAR-файлы можно найти в репозитории Maven Central, а все JAR-файлы ежедневных SNAPSHOT-сборок — в репозитории Sonatype OSS Snapshots.
Крайне важно включить JAR-файл clickhouse-jdbc с классификатором “all”, так как коннектор использует clickhouse-http и clickhouse-client — оба они входят в состав clickhouse-jdbc:all. В качестве альтернативы можно добавить JAR-файл clickhouse-client и clickhouse-http по отдельности, если вы не хотите использовать полный пакет JDBC.В любом случае убедитесь, что версии пакетов совместимы согласно матрице совместимости.

Зарегистрируйте каталог (обязательно)

Чтобы получить доступ к таблицам ClickHouse, необходимо настроить новый каталог Spark со следующими параметрами: Эти параметры можно задать одним из следующих способов:
  • Отредактировать/создать spark-defaults.conf.
  • Передать конфигурацию в команду spark-submit (или в команды CLI spark-shell/spark-sql).
  • Добавить конфигурацию при инициализации контекста.
При работе с кластером ClickHouse необходимо задать уникальное имя каталога для каждого экземпляра. Например:
Таким образом, вы сможете обращаться к таблице <ck_db>.<ck_table> в clickhouse1 из Spark SQL как clickhouse1.<ck_db>.<ck_table>, а к таблице <ck_db>.<ck_table> в clickhouse2 — как clickhouse2.<ck_db>.<ck_table>.

Использование TableProvider API (доступ на основе формата)

Помимо подхода на основе каталога, коннектор ClickHouse Spark поддерживает доступ на основе формата через TableProvider API.

Пример чтения через format API

Пример записи с использованием format

Возможности TableProvider API

TableProvider API предоставляет ряд полезных возможностей:

Автоматическое создание таблицы

При записи в несуществующую таблицу коннектор автоматически создает ее с подходящей схемой. Коннектор использует следующие значения по умолчанию:
  • Engine: Если параметр не указан, по умолчанию используется MergeTree(). Вы можете задать другой движок с помощью параметра engine (например, ReplacingMergeTree(), SummingMergeTree() и т. д.)
  • ORDER BY: Обязательно — при создании новой таблицы необходимо явно указать параметр order_by. Коннектор проверяет, что все указанные столбцы существуют в схеме.
  • Поддержка Nullable-ключей: Автоматически добавляет settings.allow_nullable_key=1, если ORDER BY содержит столбец с типом Nullable
Требуется ORDER BY: Параметр order_by обязателен при создании новой таблицы через TableProvider API. Необходимо явно указать, какие столбцы использовать в предложении ORDER BY. Коннектор проверяет, что все указанные столбцы существуют в схеме, и сгенерирует исключение, если каких-либо столбцов не хватает.Выбор движка: По умолчанию используется движок MergeTree(), но с помощью параметра engine можно указать любой движок таблицы ClickHouse (например, ReplacingMergeTree(), SummingMergeTree(), AggregatingMergeTree() и т. д.).

Параметры подключения TableProvider

При использовании API с доступом на основе формата доступны следующие параметры подключения:

Параметры подключения

Параметры создания таблицы

Эти параметры используются, если таблица не существует и её нужно создать:
  • Параметр order_by обязателен при создании новой таблицы. Все указанные столбцы должны существовать в схеме. ** Автоматически устанавливается в 1, если ORDER BY содержит столбец с типом Nullable и параметр не задан явно.
Рекомендация: В ClickHouse Cloud явно задавайте settings.allow_nullable_key=1, если столбцы в ORDER BY могут иметь тип Nullable, так как ClickHouse Cloud требует этой настройки.

Режимы записи

Spark-коннектор (и TableProvider API, и Catalog API) поддерживает следующие режимы записи в Spark:
  • append: Добавляет данные в существующую таблицу
  • overwrite: Заменяет все данные в таблице (предварительно очищает таблицу)
Перезапись партиций не поддерживается: В настоящее время коннектор не поддерживает операции перезаписи на уровне партиций (например, режим overwrite с partitionBy). Эта возможность находится в разработке. Для отслеживания статуса см. issue #34 на GitHub.

Настройка параметров ClickHouse

И Catalog API, и TableProvider API поддерживают настройку параметров, специфичных для ClickHouse (а не параметров коннектора). Эти параметры передаются в ClickHouse при создании таблиц или выполнении запросов. Параметры ClickHouse позволяют настраивать специфичные для ClickHouse значения, такие как allow_nullable_key, index_granularity, а также другие параметры на уровне таблицы и запроса. Они отличаются от параметров коннектора (например, host, database, table), которые определяют, как коннектор подключается к ClickHouse.

Использование 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 не поддерживает операции перезаписи на уровне партиций (например, режим overwrite с partitionBy). Работа над этой возможностью продолжается. Для отслеживания статуса см. issue #34 на GitHub.

Операции DDL

Вы можете выполнять DDL-операции в своём экземпляре ClickHouse с помощью Spark SQL, при этом все изменения сразу сохраняются в ClickHouse. Spark SQL позволяет писать запросы так же, как в ClickHouse, поэтому вы можете напрямую выполнять такие команды, как CREATE TABLE, TRUNCATE и другие, без каких-либо изменений, например:
При использовании Spark SQL за один раз можно выполнить только один оператор.
Приведённые выше примеры показывают запросы Spark SQL, которые можно выполнять в приложении с помощью любого API — Java, Scala, PySpark или оболочки shell.

Работа с VariantType

Поддержка VariantType доступна в Spark 4.0+ и требует ClickHouse 25.3+ с включенными экспериментальными типами JSON/Variant.
Коннектор поддерживает тип VariantType в Spark для работы с полуструктурированными данными. VariantType сопоставляется с типами ClickHouse JSON и Variant, что позволяет эффективно хранить данные с гибкой схемой и выполнять по ним запросы.
Этот раздел посвящен исключительно сопоставлению и использованию VariantType. Полный обзор всех поддерживаемых типов данных см. в разделе Поддерживаемые типы данных.

Сопоставление типов ClickHouse

Чтение данных типа VariantType

При чтении из ClickHouse столбцы JSON и Variant автоматически преобразуются в VariantType Spark:

Запись данных типа VariantType

Вы можете записывать данные типа VariantType в ClickHouse, используя типы столбцов JSON или Variant:

Создание таблиц VariantType в Spark SQL

Таблицы VariantType можно создавать с помощью DDL Spark SQL:

Настройка типов Variant

При создании таблиц со столбцами типа VariantType вы можете указать, какие типы ClickHouse использовать:

Тип JSON (по умолчанию)

Если свойство variant_types не указано, для столбца по умолчанию используется тип JSON в ClickHouse, который принимает только объекты JSON:
В результате будет создан следующий запрос к ClickHouse:

Тип Variant с несколькими типами данных

Чтобы поддерживать примитивные типы, массивы и объекты 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, используйте тип JSON по умолчанию (без свойства variant_types)
  2. Явно указывайте типы: При использовании Variant() явно перечислите все типы, которые планируете хранить
  3. Включите экспериментальные возможности: Убедитесь, что в ClickHouse включен параметр allow_experimental_json_type = 1
  4. Используйте формат JSON для записи: Для данных VariantType рекомендуется формат JSON, так как он обеспечивает лучшую совместимость
  5. Учитывайте шаблоны запросов: Типы JSON/Variant поддерживают в ClickHouse запросы по путям JSON для эффективной фильтрации
  6. Подсказки для столбцов для повышения производительности: При использовании полей JSON в ClickHouse добавление подсказок для столбцов повышает производительность запросов. В настоящее время добавление подсказок для столбцов через Spark не поддерживается. Отслеживать эту возможность можно в GitHub issue #497.

Пример: полный процесс

Конфигурации

Ниже перечислены настраиваемые конфигурации, доступные в коннекторе.
Использование конфигураций: это параметры конфигурации на уровне Spark, которые применяются как к Catalog API, так и к TableProvider API. Их можно задать двумя способами:
  1. Глобальная конфигурация Spark (применяется ко всем операциям):
  2. Переопределение для отдельной операции (только для TableProvider API — может переопределять глобальные настройки):
Либо укажите их в spark-defaults.conf или при создании сеанса Spark.

Поддерживаемые типы данных

В этом разделе описывается сопоставление типов данных между Spark и ClickHouse. В таблицах ниже приведена краткая справка по преобразованию типов данных при чтении из ClickHouse в Spark и при вставке данных из Spark в ClickHouse.

Чтение данных из ClickHouse в Spark

Вставка данных из Spark в ClickHouse

Участие в проекте и поддержка

Если вы хотите внести вклад в проект или сообщить о проблеме, мы будем рады вашей помощи! Посетите наш репозиторий GitHub, чтобы создать issue, предложить улучшения или отправить pull request. Мы приветствуем ваш вклад! Перед началом работы ознакомьтесь с рекомендациями по участию в репозитории. Спасибо, что помогаете улучшать наш коннектор ClickHouse Spark!
Последнее изменение 25 июня 2026 г.