List <UserDefinedClass>的UDF返回类型

时间:2020-02-10 11:31:14

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

我有以下代码,应该处理WrappedArrayStruct中的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似乎代表对象。

0 个答案:

没有答案