使用Java实现要在RelationalGroupedDataset.agg()中使用的用户定义聚合函数

使用Java实现要在RelationalGroupedDataset.agg()中使用的用户定义聚合函数,java,apache-spark,Java,Apache Spark,看起来您可以像这样聚合多个列: Dataset<Row> df = spark.read().textFile(inputFile); List<Row> result = df.groupBy("id") .agg(sum(df.col("price")), avg(df.col("weight"))) .collectAsList(); Dataset df=spark.read().textFile(inputFile); 列表结果=df.groupBy(

看起来您可以像这样聚合多个列:

Dataset<Row> df = spark.read().textFile(inputFile);
List<Row> result = df.groupBy("id")
  .agg(sum(df.col("price")), avg(df.col("weight")))
  .collectAsList();
Dataset df=spark.read().textFile(inputFile);
列表结果=df.groupBy(“id”)
.agg(总和(价格)、平均值(重量)
.collectAsList();
现在,我想编写自己的自定义聚合函数,而不是
sum
avg
。我该怎么做


显示了如何创建自定义聚合函数。但是这个函数是注册的,然后在SQL中使用,我不认为它是否可以在
.agg()
函数中使用。由于
agg
接受
Column
实例,并且自定义聚合函数不是一个实例。

如果您有一个扩展
UserDefinedAggregationFunction
的类
GeometricMean
,那么您可以像这样使用它(取自):


将其转换为Java应该很容易

谢谢,只有一个问题。由于我对Scala不太熟练,Scala中的
gm(col(“id”)
会翻译成Java的
gm.apply(col(“id”)
,对吗?
// Create an instance of UDAF GeometricMean.
val gm = new GeometricMean

// Show the geometric mean of values of column "id".
df.groupBy("group_id").agg(gm(col("id")).as("GeometricMean")).show()