我在项目中使用kryo序列化程序作为序列化程序使用spark并使用scala编写。我注册了我在项目中使用的所有类,并且有一个类不是序列化或者是desiralize,它是链接的哈希映射。 链接哈希映射注册:
kryo.register(scala.collection.mutable.linkedHashMap [_,_])
我从弹性中获取数据,属性的运行时类型是linkedHashMap。 例如文档看起来像:person {age:20,name:“yarden”},map to linkedHashMap [String,Any]以及是否还有其他对象等。
当我想反序列化存储为linkedHashMap的数据时(例如收集RDD),结果只是空对象。
我尝试使用MapSerializer(寄存器函数中的另一个参数),但它失败了,因为它适用于java linkedHashMap。 我尝试为scala linkedHashMap搜索合适的序列化程序,但我没有找到。 有一个解决方案,每次我将LinkedHashMap转换为Map,它是工作,但这不是一个好习惯。 我想也许有一种方法可以使运行时类型成为map而不是linkedHashMap但我找不到任何解决方案。
我相信最好的做法是找到适合于scala的LinkedHashMap的序列化程序,但我没有找到任何。
任何我未能成功解决的问题的解决方案都会受到欢迎。
答案 0 :(得分:1)
尝试使用TraversibleSerializer。
例如:
kryo.register(classOf[mutable.LinkedHashMap[Any, Any]],
new TraversableSerializer[(Any, Any), mutable.LinkedHashMap[Any, Any]](true))