如何在Spark UDAF中实现fastutils映射?

时间:2019-02-05 23:47:54

标签: scala apache-spark fastutil

我正在构建一个Spark UDAF,将中间数据存储在fastutils映射中。模式如下:

def bufferSchema = new StructType().add("my_map_col", MapType(StringType, IntegerType))

我初始化没有问题:

def initialize(buffer: MutableAggregationBuffer) = {
   buffer(0) = new Object2IntOpenHashMap[String]()
}

当我尝试更新时出现问题:

def update(buffer: MutableAggregationBuffer, input: Row) = { 
  val myMap = buffer.getAs[Object2IntOpenHashMap[String]](0)
  myMap.put(input.getAs[String](0), 1)
  buffer(0) = myMap
}

出现以下错误:

Caused by: java.lang.ClassCastException: scala.collection.immutable.Map$EmptyMap$ cannot be cast to it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap

有什么办法可以使我工作?

1 个答案:

答案 0 :(得分:1)

  

有什么办法可以使我工作?

不是。

buffer.getAs[Object2IntOpenHashMap[String]](0)

等同于

buffer.get(0).asInstanceOf[Object2IntOpenHashMap[String]]]

the external type for MapType is scala.collection.Map

实际上,无论如何,这都是死胡同-UserDefinedAggregate函数make full copy of data on each callAggregator可能会带来更好的运气(如链接的问题所示)。