Как мне кодировать объект fastutils в spark / scala?
Прорабатывая детали моего предыдущего вопроса здесь. Я строю функцию Aggregator, которая принимает класс case, который содержит fastutils Object2IntOpenHashMap[String]. Что-то вроде этого:
type FastStringMap = Object2IntOpenHashMap[String]
case class MyClass(x1 : String, x2 : String, x3 : FastStringMap)
class MyTestAggregate extends Aggregator[MyClass, MyClass, MyClass] with Serializable {
...
def bufferEncoder : Encoder[MyClass] = Encoders.product[MyClass]
def outputEncoder : Encoder[MyClass] = Encoders.product[MyClass]
}
Это приводит к следующей ошибке:
Exception in thread "main" java.lang.UnsupportedOperationException: No Encoder found for FastStringMap.
- field (class: "it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap", name: "x3")
- root class: "MyClass"
Я попытался создать пользовательский кодировщик класса case (как здесь), но он, похоже, не работает
type FastStringArray = Array[(String, Int)]
type MyClassEncoded = (String, String, FastStringArray)
def toFastArray(fsm : FastStringMap) : FastStringArray = {
val a = new ListBuffer[(String, Int)]
val mapIter = fsm.object2IntEntrySet().fastIterator()
while(mapIter.hasNext()) {
val x = mapIter.next()
a += ((x.getKey(), x.getIntValue()))
}
a.toArray
}
def fromFastArray(fsa : FastStringArray) : FastStringMap = {
val (a1, a2) = fsa.unzip
new FastStringMap(a1, a2)
}
implicit def toEncoded(x: MyClass): MyClassEncoded = (
x.x1,
x.x2,
toFastArray(x.x3)
)
implicit def fromEncoded(x: MyClassEncoded): MyClass = new MyClass(
x._1,
x._2,
fromFastArray(x._3)
)