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

How do I implement a fastutils map in a Spark UDAF?

我正在构建一个 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

我有什么方法可以让它工作吗?

Any way I can make this work?

不是真的。这个

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

相当于

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

the external type for MapType is scala.collection.Map.

在实践中无论如何这是一个死胡同 - UserDefinedAggregate 功能 Aggregator 你可能会好运(如链接问题)。