在 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。
请查看以下门票了解更多信息:
我有一个案例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。
请查看以下门票了解更多信息: