首页 > 解决方案 > 列表的 UDF 返回类型

问题描述

我有以下代码,它应该处理WrappedArrays 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)无法转换为结构

我找不到我可能做错了什么,因为ArrayType代表集合并且Struct似乎代表对象。

标签: apache-sparkjava-8apache-spark-dataset

解决方案


推荐阅读