如何创建自定义groupBy聚合器?

时间:2017-06-19 21:53:40

标签: java apache-spark apache-spark-sql

我正在尝试创建自己的方差函数来计算DataFrame groupBy聚合步骤期间的方差。我不能使用functions.variance()方法,因为输入的大小存储在一列中。我想找到列“PercentEaten”的方差,其中项目总数存储在名为“NumberOfItems”的列中。

我对如何创建自己的返回Column类型的函数感到困惑,因为.agg()方法需要具有Column返回类型的函数。

这是我正在寻找的一个例子

myDF.groupBy(col("Store"), col("week")).agg(sum(col("PercentEaten")).divide(col("NumberOfItems")).as("MeanPercentEaten"), myVariance(col("PercentEaten"), col("NumberOfItems")).as("VariancePercentEaten");

我不确定如何定义myVariance()方法。这也是我第一次使用Spark,所以我的编码风格可能不是最好的。

1 个答案:

答案 0 :(得分:0)

  

我不确定如何定义myVariance()方法。

这是用户定义的聚合函数(又名UDAF)的示例。

要创建一个,您必须实施org.apache.spark.sql.expressions.UserDefinedAggregateFunction

  

实现用户定义的聚合函数(UDAF)的基类。

之后,您应该创建自定义UDAF的实例,并使用applydistinct方法来使用它。

  

apply(Column ... exprs)使用给定的列作为输入参数为此UDAF创建一个列。

     

distinct(Column ... exprs)使用给定列的不同值作为输入参数为此UDAF创建一个列。

(我不会提供任何代码,因为Java不是Spark的语言)。