Как мне кодировать объект fastutils в spark / scala? - PullRequest
0 голосов
/ 07 февраля 2019

Прорабатывая детали моего предыдущего вопроса здесь .Я строю функцию 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)
  )
...