Numeric[_]
class mySumToMap[K, V: Numeric](keyType: DataType, valueType: DataType)
extends UserDefinedAggregateFunction {
...
使用
Implicitly
要在运行时获取它:
val n = implicitly[Numeric[V]]
并使用其
plus
方法代替
+
一
zero
代替
0
buffer1(0) = map1 ++ map2.map{
case (k,v) => k -> n.plus(v, map1.getOrElse(k, n.zero))
}
为了支持更广泛的类型集,您可以使用
cats
Monoid
import cats._
import cats.implicits._
class mySumToMap[K, V: Monoid](keyType: DataType, valueType: DataType)
extends UserDefinedAggregateFunction {
...
override def merge(buffer1: MutableAggregationBuffer, buffer2: Row) = {
val map1: Map[K, V] = buffer1.getMap[K, V](0)
val map2: Map[K, V] = buffer2.getMap[K, V](0)
val m = implicitly[Monoid[Map[K, V]]]
buffer1(0) = m.combine(map1, map2)
}