以Map作为字段的快速json反序列化



我想将Json格式的Array[Byte]反序列化到下面描述的Event类,我想尽可能快地完成它。Event类有两个Int/String字段,这应该不是问题。json格式字节数组的所有内容必须转换为Map。json/Map的键是未知的,并且没有任何嵌套的jsonobject或数组。

E。Json: {"someKey1"; " someeval "; "someInt"; 34; "anotherKey";toMap

这是我到目前为止所做的

import play.api.libs.json.{JsObject, Json}
...
override def line2Event(
line: Array[Byte],
id: Int
): Event = {
val map = Json.parse(line).as[JsObject].value.toMap
val timestamp = map.getOrElse("timestamp", id).toString.toLong
Event(id, "GenericJson", timestamp, map)

class Event(
val id: Int,
val eventType: String,
val timestamp: Long,
extraArgs: Map[String, Any]
)

对于某些数据集,这个play api实现的速度大约是25K消息/秒。我想改进它。使用其他框架会有帮助吗?比如jsoniter ?

在我的情况下,然而,我没有特定字段的类(即,json的所有键值对都存储到事件的Map字段)。这个或其他框架是否包含像我使用的那样更快的解析方法?

所以,我也试过使用jackson解析

lazy val module = new MapModule{}
lazy val mapper = JsonMapper.builder()
.addModule(module)
.build()
...
val map: Map[String, Any] = mapper.readValue(line, classOf[Map[String, Any]])

由于我需要一个不可变的scala映射,请注意,我还注册了DefaultScalaModule。

不幸的是,因为这个类是在Flink中使用的,它需要是可序列化的,而DefaultScalaModule不是(ObjectMapper是)。其他库(如jsoniter)也出现了类似的问题。该怎么办?我应该创建一个新问题吗?

编辑:我使用了mapper和scalaModule的惰性值(只得到MapModule),它们现在在需要时初始化(即,在flink worker中)。我有一个NotSerializableException。部分

速度约为80K事件/秒,比以前的实现至少快3倍。也许解析字节数组直接到Map也会与play json一样快,但我找不到一种方法来做到这一点。

相关内容

  • 没有找到相关文章