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

时间:2018-10-28 02:33:28

标签: 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();

现在,我想编写自己的自定义聚合函数,而不是sumavg。我该怎么办?

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

1 个答案:

答案 0 :(得分:1)

如果您有一个扩展了GeometricMean的类UserDefinedAggregationFunction,则可以这样使用(摘自https://docs.databricks.com/spark/latest/spark-sql/udaf-scala.html):

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

应该很容易将其转换为Java