Java Spark UDAF返回Struct Field \ multiple列

时间:2017-07-07 18:20:51

标签: java apache-spark user-defined-functions

我正在编写一个UDAF聚合函数,我想返回一个数据类型,它是一个带有列名的结构(例如long类型的start和end)或2列。

在evaluate函数中尝试返回一个map类型和一个数组,但这并不是我所期待的。

很想知道它。 感谢

1 个答案:

答案 0 :(得分:1)

最简单的方法是在一个字段中返回带有值的列表,然后将其展开为几列。

在这里您可以阅读UDAF尝试返回两个Integer列的示例:


UDAF(重要的代码部分)


public YourUDAFName(someParams) {
    [...]
    _returnDataType = DataTypes.createArrayType(DataTypes.IntegerType);
}
[...]
@Override
public Object evaluate(Row buffer) {
    List<Integer> output = new ArrayList<>();
    output.add(1); //Here put your logical...
    output.add(5); // "
    return output;    
}

使用示例...


Dataset<Row> ds = getYourDatasetHere();
YourUDAFName udaf = new YourUDAFName(someParams);
ds.groupBy("yourGroupByKey")
.agg(udaf .apply(
    col("someColumnFromDs"),
    col("someOtherColumn")).as("columnWithList"));

// Here we expand the "columnWithList"...
List<Column> newColumns = new ArrayList<>();
for (int i = 0; i < numElementInTheList; i++) {
    ds = ds.withColumn("nameOfYourExpandedColumn", ds.col("outputByIntervals").getItem(i));
}
ds.show();

希望对您有所帮助!