0

在编写 java 代码时,我通常使用不可变值类型。有时它是通过库(Immutables、AutoValue、Lombok),但大多只是普通的 java 类:

  • 所有final领域
  • 以所有字段为参数的构造函数

(鉴于当前的 spark 支持,此问题适用于 java 11 及更低版本)。

在 Spark Sql 中,数据类型需要一个Encoder. 使用现成的编码器Encoder.bean(MyType.class),如使用这种不可变的数据类型会导致“非法反射访问操作”。

我很好奇 spark sql (dataset) 方法是什么。显然我可以放松这一点,让它成为一个可变的 pojo。


更新

查看Encoders.bean它的代码确实必须是一个经典的、可变的 POJO。反射代码寻找合适的设置器。此外(并且记录在案)唯一支持的集合类型是array,listmap(not set)。

4

1 回答 1

0

这其实是误诊。我的数据类型的不变性不会导致反射访问问题。这是一个 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

于 2021-10-20T15:31:35.430 回答