【问题标题】:implement sum aggregator on custom case class on spark sql dataframe (UDAF)在 spark sql 数据框 (UDAF) 中对自定义案例类实现总和聚合
【发布时间】:2015-10-02 08:31:05
【问题描述】:

我有一个案例类

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)

【问题讨论】:

    标签: scala apache-spark dataframe apache-spark-sql


    【解决方案1】:

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

    请查看以下门票以获取更多信息:

    【讨论】:

      猜你喜欢
      • 2020-04-23
      • 2016-02-29
      • 2018-01-03
      • 2016-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-20
      • 2020-11-30
      相关资源
      最近更新 更多