不可变数据类型的 spark sql 编码器
spark sql encoder for immutable data type
我在编写 java 代码时通常使用不可变值类型。有时它是通过库(Immutables、AutoValue、Lombok)实现的,但大多数情况下只是普通的 java 类 with:
- 所有
final
个字段
- 以所有字段为参数的构造函数
(此问题适用于 java 11 及以下,目前支持 spark)。
在 Spark Sql 中,数据类型需要 Encoder
。使用像 Encoder.bean(MyType.class)
这样的现成编码器,使用这种不可变数据类型会导致“非法反射访问操作”。
我很好奇这里的 spark sql(数据集)方法是什么。显然我可以放松这一点并使其成为一个可变的 pojo。
更新
查看 Encoders.bean
的代码,它确实必须是一个经典的、可变的 POJO。反射代码寻找合适的设置器。此外(这已记录在案)唯一支持的集合类型是 array
、list
和 map
(不是 set
)。
这其实是误诊。我的数据类型的不变性不会导致反射访问问题。这是一个 JVM 11+ 问题(主要在此处注明)https://github.com/renaissance-benchmarks/renaissance/issues/241
通过添加以下 JVM 参数,一切正常:
--illegal-access=deny --add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/sun.nio.ch=ALL-UNNAMED
我在编写 java 代码时通常使用不可变值类型。有时它是通过库(Immutables、AutoValue、Lombok)实现的,但大多数情况下只是普通的 java 类 with:
- 所有
final
个字段 - 以所有字段为参数的构造函数
(此问题适用于 java 11 及以下,目前支持 spark)。
在 Spark Sql 中,数据类型需要 Encoder
。使用像 Encoder.bean(MyType.class)
这样的现成编码器,使用这种不可变数据类型会导致“非法反射访问操作”。
我很好奇这里的 spark sql(数据集)方法是什么。显然我可以放松这一点并使其成为一个可变的 pojo。
更新
查看 Encoders.bean
的代码,它确实必须是一个经典的、可变的 POJO。反射代码寻找合适的设置器。此外(这已记录在案)唯一支持的集合类型是 array
、list
和 map
(不是 set
)。
这其实是误诊。我的数据类型的不变性不会导致反射访问问题。这是一个 JVM 11+ 问题(主要在此处注明)https://github.com/renaissance-benchmarks/renaissance/issues/241
通过添加以下 JVM 参数,一切正常:
--illegal-access=deny --add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/sun.nio.ch=ALL-UNNAMED