кодировщик spark sql для неизменяемого типа данных

#java #apache-spark #apache-spark-sql #apache-spark-dataset #apache-spark-encoders

Вопрос:

Я обычно использовал неизменяемые типы значений при написании кода java. Иногда это происходило через библиотеки (неизменяемые, автоматическое значение, Ломбок), но в основном это были просто ванильные классы java с:

  • все final поля
  • конструктор со всеми полями в качестве параметров

(Этот вопрос относится к java 11 и ниже, учитывая текущую поддержку spark).

В Spark Sql типы данных требуют Encoder . Использование готовых кодеров , таких как Encoder.bean(MyType.class) использование такого неизменяемого типа данных, приводит к «незаконной операции отражающего доступа».

Мне любопытно, каков здесь подход spark sql (набор данных). Очевидно, я мог бы ослабить это и сделать его изменчивым pojo.


Обновить

Изучение кода для Encoders.bean этого действительно должно быть классическим изменяемым POJO. Код отражения ищет соответствующие установщики. Кроме того (и это задокументировано) единственными поддерживаемыми типами коллекций являются array list и map (не set ).

Ответ №1:

На самом деле это был неверный диагноз. Неизменность моего типа данных не вызывала проблем с отражающим доступом. Это была проблема JVM 11 (в основном отмеченная здесь) https://github.com/renaissance-benchmarks/renaissance/issues/241

При добавлении следующих аргументов JVM все работает правильно:

—незаконный доступ=запретить —добавить-открывает java.base/java.nio=ВСЕ БЕЗЫМЯННЫЕ —добавить-открывает java.base/sun.nio.ch=ВСЕ БЕЗЫМЯННЫЕ