在 spark sql 数据帧 (UDAF) 上的自定义案例 class 上实施总和聚合器

implement sum aggregator on custom case class on spark sql dataframe (UDAF)

我有一个案例class

case class Vec(var a: Int, var b: Int) {
    def +(v: Vec): Vec = {
        a += v.a
        b += v.b
        this
    }
}

现在如果我写

val rDistDS: RDD[(Int, Vec)] = ...
val sums: RDD[(Int, Vec)] = rDistDS.reduceByKey(_+_)

我得到与每个 Int 键关联的所有向量的总和。太好了。

但是,我想用 DataFrame 来执行此操作,以潜在地帮助查询规划器并使代码更具可读性。

我希望能够做到以下几点

val df: DataFrame = ... // each row has Row(theInt: Int, vec: Vec)
df.groupBy(df("theInt")).agg(sum(df("vec")))

有没有办法在我的自定义 case class 上实现此 sum 聚合器,以便与上面模拟的 Spark SQL 数据框一起使用?

现在我得到

java.lang.ClassCastException: 
    org.apache.spark.sql.types.IntegerType$ cannot be cast to 
        org.apache.spark.sql.types.StructType
at org.apache.spark.sql.catalyst.expressions.Cast.org$apache$spark$sql$catalyst$expressions$Cast$$cast(Cast.scala:429)

从 Spark 1.4 开始,我认为不支持 UDAF。

请查看以下门票了解更多信息: