Java Spark UDAF 返回结构字段\多列

Posted

技术标签:

【中文标题】Java Spark UDAF 返回结构字段\\多列【英文标题】:Java Spark UDAF to return Struct Field \ multiple columnsJava Spark UDAF 返回结构字段\多列 【发布时间】:2017-07-07 18:20:51 【问题描述】:

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

在评估函数中试图返回一个映射类型和一个数组,但这不是我所期望的。

很想知道这件事的线索。 谢谢

【问题讨论】:

我有一个类似的问题,已经回答了。也许这可能会有所帮助:***.com/q/33939642/1433614 【参考方案1】:

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

您可以在此处阅读 UDAF 尝试返回两个整数列的示例:


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();

希望对你有帮助!

【讨论】:

以上是关于Java Spark UDAF 返回结构字段\多列的主要内容,如果未能解决你的问题,请参考以下文章

基于两列或多列的 Spark DataFrame 聚合

如何使用接受多列作为参数的java为hive编写UDAF?

Scala 中的 Spark SQL(v2.0) UDAF 返回空字符串

使用 ArrayType 作为 bufferSchema 的 Spark UDAF 性能问题

极简spark教程spark聚合函数

Spark篇---SparkSQL中自定义UDF和UDAF,开窗函数的应用