存储 Leap Frame

我们能够使用不同的序列化策略来存储和加载 Leap Frame。目前提供的格式包括:

  1. JSON
  2. Avro
  3. Binary

如果以上格式不能满足你的使用需求,你可以定制自己的序列化格式。

Leap Frame 示例

后续所有的序列化示例都会使用如下 Leap Frame。

  1. val schema = StructType(StructField("features", TensorType(BasicType.Double)),
  2. StructField("name", ScalarType.String),
  3. StructField("list_data", ListType(BasicType.String)),
  4. StructField("nullable_double", ScalarType(BasicType.Double, true)),
  5. StructField("float", ScalarType.Float),
  6. StructField("byte_tensor", TensorType(BasicType.Byte)),
  7. StructField("short_list", ListType(BasicType.Short)),
  8. StructField("nullable_string", ScalarType(BasicType.String, true))).get
  9. val dataset = Seq(Row(Tensor.denseVector(Array(20.0, 10.0, 5.0)),
  10. "hello", Seq("hello", "there"),
  11. Option(56.7d), 32.4f,
  12. Tensor.denseVector(Array[Byte](1, 2, 3, 4)),
  13. Seq[Short](99, 12, 45),
  14. None))
  15. val frame = DefaultLeapFrame(schema, dataset)

JSON

  1. // Store Leap Frame
  2. for(bytes <- frame.writer("ml.combust.mleap.json").toBytes();
  3. frame2 <- FrameReader("ml.combust.mleap.json").fromBytes(bytes)) {
  4. println(new String(bytes)) // print the JSON bytes
  5. assert(frame == frame2)
  6. }

AVRO

  1. // Store Leap Frame
  2. for(bytes <- frame.writer("ml.combust.mleap.avro").toBytes();
  3. frame2 <- FrameReader("ml.combust.mleap.avro").fromBytes(bytes)) {
  4. println(new String(bytes)) // print the Avro bytes
  5. assert(frame == frame2)
  6. }

二进制数据

最有效的存储格式,使用数据的输入 / 输出流来序列化 Leap Frame 数据。

  1. // Store Leap Frame
  2. for(bytes <- frame.writer("ml.combust.mleap.binary").toBytes();
  3. frame2 <- FrameReader("ml.combust.mleap.binary").fromBytes(bytes)) {
  4. println(new String(bytes)) // print the binary bytes
  5. assert(frame == frame2)
  6. }

自定义格式

MLeap 允许用户自己实现序列化器。