【问题标题】:spark sql encoder for immutable data type用于不可变数据类型的 spark sql 编码器
【发布时间】:2021-12-07 10:22:59
【问题描述】:

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

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

(这个问题适用于 java 11 及更低版本,考虑到当前的 spark 支持)。

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

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


更新

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

【问题讨论】:

    标签: java apache-spark apache-spark-sql apache-spark-dataset apache-spark-encoders


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2017-08-31
      • 1970-01-01
      • 1970-01-01
      • 2014-12-06
      • 2018-04-18
      • 2014-07-29
      • 1970-01-01
      • 2015-06-04
      • 1970-01-01
      相关资源
      最近更新 更多