apache-spark - 列表的 UDF 返回类型
问题描述
我有以下代码,它应该处理WrappedArray
s 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
似乎代表对象。
解决方案
推荐阅读
- python - 限制python函数仅将列表作为参数
- python - Django-Channels 2 Communicator 接收输出()不起作用
- angular8 - 错误 ReferenceError:未定义 strXmlBullet - pptxgenjs
- flutter - 位置参数太多
- css - 如何创建发光的 rgb 网格复选框
- angular - 如何冻结 Y 轴标签并使 X 轴可滚动以用于 Angular Ngx 图表条形图
- python - 我该如何解决这个 SyntaxError: invalid syntax?
- linux - 如何在 Ubuntu 上安装 Snowflake 的 ODBC 驱动程序?
- python - 在 Python 中初始化矩阵列表
- python - No such a column key