Что предлагается
Добавить поддержку 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 в рантайме через рефлексию.
Ключевые моменты, которые стоит обсудить:
- В Spark 4 у
JdbcDialect появился метод isObjectNotFoundException,
через который JdbcUtils.tableExists отличает «таблицы нет» от реальной
ошибки. ClickHouse JDBC-драйвер не выставляет SQLState, поэтому без
переопределения этого метода все операции записи падают на probe-запросе
SELECT 1 FROM t WHERE 1=0 (ошибка UNKNOWN_TABLE). Предлагается
переопределить его, распознавая код ошибки ClickHouse 60 / UNKNOWN_TABLE
по тексту сообщения — это рабочее, но не самое строгое решение, и здесь
хотелось бы услышать ваше мнение.
- Spark 4 требует Java 17 и стандартный набор
--add-opens (иначе падает
обработка Date/DateTime). Предлагается добавлять их в test-таск на Java 9+.
- На Spark 4 поведение чтения массивов меняется: с драйвером ClickHouse 0.7.x
несколько типов (Array(Int16/Int32/Int64/Float32/Float64)), ранее
считавшихся неподдерживаемыми, теперь читаются успешно; остальные кидают
новый класс ошибки COLUMN_ARRAY_ELEMENT_TYPE_MISMATCH. Ожидания в тестах
станут версионно-специфичными.
- 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 выше.
Что предлагается
Добавить поддержку 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 / Scala 2.13 сейчас не могут использовать диалект вообще.
build.gradleуже стоят TODO мейнтейнеров про кросс-билд для Scala 2.13и для разных версий Spark — то есть потребность осознавалась.
изменений, так что цена поддержки невысока.
Как это будет работать
Кросс-билд через 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.13spark3(текущее поведение публикации не меняется)Версионно-специфичные исходники: диалект для каждой мажорной версии
Spark лежит в своём source-каталоге (
scala-spark3/scala-spark4),реестр выбирает реализацию по
spark.versionв рантайме через рефлексию.Ключевые моменты, которые стоит обсудить:
JdbcDialectпоявился методisObjectNotFoundException,через который
JdbcUtils.tableExistsотличает «таблицы нет» от реальнойошибки. ClickHouse JDBC-драйвер не выставляет SQLState, поэтому без
переопределения этого метода все операции записи падают на probe-запросе
SELECT 1 FROM t WHERE 1=0(ошибкаUNKNOWN_TABLE). Предлагаетсяпереопределить его, распознавая код ошибки ClickHouse 60 /
UNKNOWN_TABLEпо тексту сообщения — это рабочее, но не самое строгое решение, и здесь
хотелось бы услышать ваше мнение.
--add-opens(иначе падаетобработка
Date/DateTime). Предлагается добавлять их в test-таск на Java 9+.несколько типов (
Array(Int16/Int32/Int64/Float32/Float64)), ранеесчитавшихся неподдерживаемыми, теперь читаются успешно; остальные кидают
новый класс ошибки
COLUMN_ARRAY_ELEMENT_TYPE_MISMATCH. Ожидания в тестахстанут версионно-специфичными.
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 выше.