#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=ВСЕ БЕЗЫМЯННЫЕ