我有以下代码,应该处理WrappedArray
个Struct
中的column_x
个并派生一个新列(new_column
),这应该是成为用户定义对象的数组(我想是,在Spark术语中,它是结构数组):
public Dataset<Row> extractFeature(Dataset<Row> originalDataset) {
UserDefinedFunction myUDF = functions.udf(extract(), DataTypes.createArrayType(
DataTypes.createStructType(new StructField[]{
DataTypes.createStructField("attr_a", DataTypes.StringType, true),
DataTypes.createStructField("attr_b", DataTypes.StringType, true),
DataTypes.createStructField("attr_c", DataTypes.StringType, true),
DataTypes.createStructField("attr_d", DataTypes.LongType, true)
})
));
return originalDataset
.withColumn("new_column", myUDF.apply(col("column_x")))
}
private class MyClass {
private String attrA;
private String attrB;
private String attrC;
private Long attrD;
}
private UDF1<WrappedArray<Row>, List<MyClass>> extract() {
return (structsArr) -> {
List<Row> structsList = JavaConversions.seqAsJavaList(structsArr);
// some logic
List<MyClass> finalOutput = getFinalOutput(...);
return finalOutput;
};
}
但是,当我在程序中执行此代码段时,它将返回以下异常:
由以下原因引起:java.lang.IllegalArgumentException:类型(com.domain.name.and.so.on.MyClass)的值(com.domain.name.and.so.on.MyClass@6ba3fec1)不能转换为struct
我找不到我可能做错的事情,因为ArrayType
代表集合,Struct
似乎代表对象。