【发布时间】:2020-01-06 19:53:03
【问题描述】:
我有这个简单的模型类
@Value // lombok - create standard all arg constructor and getters
public class ModelA implements Serializable {
private String word;
private double value;
}
这个简单的测试失败了:
public class SparkSerializationTest {
private SparkSession spark = SparkSession.builder()
.master("local")
.appName("Test")
.getOrCreate();
@Test
public void testSerializationModelA() {
ModelA modelA1 = new ModelA("A1", 12.34);
ModelA modelA2 = new ModelA("A2", 56.78);
Dataset<ModelA> dataset = spark.createDataset(
Arrays.asList(modelA1, modelA2),
Encoders.bean(ModelA.class));
List<ModelA> yo = dataset.collectAsList(); // <== *** failure here ***
assertThat(yo).isEqualTo(Arrays.asList(modelA1, modelA2));
}
}
例外:
java.util.concurrent.ExecutionException: org.codehaus.commons.compiler.CompileException: File 'generated.java', Line 24, Column 67: failed to compile: org.codehaus.commons.compiler.CompileException: File 'generated.java', Line 24, Column 67: No applicable constructor/method found for zero actual parameters; candidates are: "com.xxx.yyy.ModelA(java.lang.String, double)"
它似乎需要一个零参数的构造函数。但我希望我的模型是不可变的,因此具有完整的 arg 构造函数并且没有设置器。我该怎么做?
【问题讨论】:
标签: java apache-spark deserialization immutability