Я очень озадачен тем, почему следующий код выдает исключение из заголовка:
class Scratch {
public static void main(String[] args) {
SparkSession spark = SparkSession
.builder()
.master("local")
.getOrCreate();
JavaSparkContext javaSparkContext = new JavaSparkContext(spark.sparkContext());
JavaRDD<String> javaRdd = javaSparkContext.parallelize(Arrays.asList("a", "b", "c"));
JavaRDD<Foo> simpleRdd = javaRdd.map(Foo::new);
Dataset fooDs = spark.createDataset(simpleRdd.rdd(), Encoders.bean(Foo.class)); // works perfectly
UDF1<String, Bar> newBar = Bar::new;
UserDefinedFunction newBarUdf = udf(newBar, Encoders.bean(Bar.class).schema());
Dataset fooBarDs = fooDs.withColumn("test", newBarUdf.apply(col("name"))); // doesn't work
fooBarDs.show(false);
}
public static class Bar implements Serializable {
private String alias;
public Bar(String alias) {
this.alias = alias;
}
public Bar() {
}
public String getAlias() {
return alias;
}
public void setAlias(String alias) {
this.alias = alias;
}
}
public static class Foo implements Serializable {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Foo(String name) {
this.name = name;
}
public Foo() {
}
}
}
У кого-нибудь есть идеи, почему это не поддерживается, потому что такое ощущение, что оно должно быть. Что я делаю неправильно? Есть ли обходной путь?
Примечание. В реальном примере есть несколько столбцов с примитивными полями, и мне нужна возможность преобразовать класс Java во вложенную структуру в виде столбца.