提问者:小点点

用于不可变数据类型的Spark sql编码器


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

  • 所有最终字段
  • 所有字段作为参数的构造函数

(此问题适用于java11及以下,考虑到当前的火花支持)。

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

我很好奇这里的火花sql(数据集)方法是什么。显然,我可以放松这一点,让它成为一个可变的pojo。

更新

查看Encoders. bean的代码,它确实必须是一个经典的、可变的POJO。反射代码寻找适当的设置器。此外(这已记录在案)唯一支持的集合类型是数组列表map(不是set)。


共1个答案

匿名用户

这实际上是一个误诊。我的数据类型的不变性并没有导致反射式访问问题。这是一个JVM11问题(主要在这里指出)https://github.com/renaissance-benchmarks/renaissance/issues/241

通过添加以下JVM参数,一切都正常工作:

--非法访问=拒绝--add-打开java. base/java.nio=ALL-UNNAMED--add-打开java.base/sun.nio.ch=ALL-UNNAMED

相关问题