Skip to content

Add spark 4+ and scala 2.13 support #22

Description

@CMBCKSRL

Что предлагается

Добавить поддержку Apache Spark 4.x (Scala 2.13) в дополнение к текущему
Spark 3.5.x (Scala 2.12). Сейчас и сборка, и рантайм-реестр жёстко привязаны
к 3.5/2.12 (ClickhouseDialectRegistry бросает UnsupportedOperationException
на любой версии, кроме 3.5), поэтому на Spark 4 расширение не запускается.

Зачем

  • Spark 4.x уже выпущен и постепенно становится дефолтом; пользователи на
    Spark 4 / Scala 2.13 сейчас не могут использовать диалект вообще.
  • В build.gradle уже стоят TODO мейнтейнеров про кросс-билд для Scala 2.13
    и для разных версий Spark — то есть потребность осознавалась.
  • Сама логика диалекта оказалась совместимой со Spark 4 практически без
    изменений, так что цена поддержки невысока.

Как это будет работать

Кросс-билд через Gradle-property (по аналогии с уже существующим
-Pclickhouse.jdbc.version):

  • -PsparkProfile=spark3 → Scala 2.12 / Spark 3.5.1 / Java 8–11, артефакт _2.12
  • -PsparkProfile=spark4 → Scala 2.13 / Spark 4.1.2 / Java 17, артефакт _2.13
  • по умолчанию spark3 (текущее поведение публикации не меняется)

Версионно-специфичные исходники: диалект для каждой мажорной версии
Spark лежит в своём source-каталоге (scala-spark3 / scala-spark4),
реестр выбирает реализацию по spark.version в рантайме через рефлексию.

Ключевые моменты, которые стоит обсудить:

  1. В Spark 4 у JdbcDialect появился метод isObjectNotFoundException,
    через который JdbcUtils.tableExists отличает «таблицы нет» от реальной
    ошибки. ClickHouse JDBC-драйвер не выставляет SQLState, поэтому без
    переопределения этого метода все операции записи падают на probe-запросе
    SELECT 1 FROM t WHERE 1=0 (ошибка UNKNOWN_TABLE). Предлагается
    переопределить его, распознавая код ошибки ClickHouse 60 / UNKNOWN_TABLE
    по тексту сообщения — это рабочее, но не самое строгое решение, и здесь
    хотелось бы услышать ваше мнение.
  2. Spark 4 требует Java 17 и стандартный набор --add-opens (иначе падает
    обработка Date/DateTime). Предлагается добавлять их в test-таск на Java 9+.
  3. На Spark 4 поведение чтения массивов меняется: с драйвером ClickHouse 0.7.x
    несколько типов (Array(Int16/Int32/Int64/Float32/Float64)), ранее
    считавшихся неподдерживаемыми, теперь читаются успешно; остальные кидают
    новый класс ошибки COLUMN_ARRAY_ELEMENT_TYPE_MISMATCH. Ожидания в тестах
    станут версионно-специфичными.
  4. Scalafix на профиле spark4 придётся отключить: semanticdb-scalac пока не
    опубликован для версии Scala 2.13, которую подтягивает Spark 4. На spark3
    Scalafix продолжит работать. (Готов обсудить альтернативы — например,
    пин конкретной версии Scala/semanticdb.)

CI: матрицы тестов и релиза расширяются на оба профиля с соответствующей
версией Java.

Статус

Черновая реализация уже готова и проверена локально (все тесты зелёные на
обоих профилях и обоих версиях драйвера 0.7.2 / 0.9.8 против ClickHouse 25.9).
Готов оформить PR после обсуждения подхода — особенно по пунктам 1 и 4 выше.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions