在编写 java 代码时,我通常使用不可变值类型。有时它是通过库(Immutables、AutoValue、Lombok),但大多只是普通的 java 类:
- 所有
final
领域 - 以所有字段为参数的构造函数
(鉴于当前的 spark 支持,此问题适用于 java 11 及更低版本)。
在 Spark Sql 中,数据类型需要一个Encoder
. 使用现成的编码器Encoder.bean(MyType.class)
,如使用这种不可变的数据类型会导致“非法反射访问操作”。
我很好奇 spark sql (dataset) 方法是什么。显然我可以放松这一点,让它成为一个可变的 pojo。
更新
查看Encoders.bean
它的代码确实必须是一个经典的、可变的 POJO。反射代码寻找合适的设置器。此外(并且记录在案)唯一支持的集合类型是array
,list
和map
(not set
)。