Я пытаюсь превратить объект Scala (т.е. класс case) в байтовый массив.
Чтобы сделать это, я вставляю содержимое объекта в GenericRecordBuilder, используя его конкретную схему, и, в конце концов, используя GenericDatumWriter, я превращаю его в байтовый массив.
У меня нет проблем с установкой примитивных типов и массива примитивных типов в GenericRecordBuilder.
Но мне нужна помощь для вставки массива записей в GenericRecordBuilder и создания из него байтового массива.
Как правильно вставить массив записей в GenericRecordBuilder?
Вот часть того, что я пытаюсь сделать:
Это схема:
{
"type": "record",
"name": "test1",
"namespace": "ns",
"fields": [
{
"name": "t_name",
"type": "string",
"default": "a"
},
{
"name": "t_num",
"type": "int",
"default": 0
},
{"name" : "t_arr", "type":
["null",
{"type": "array", "items": {
"name": "t_arr_a",
"type": "record",
"fields": [
{
"name": "t_arr_f1",
"type": "int",
"default": 0
},
{
"name": "t_arr_f2",
"type": "int",
"default": 0
}
]
}
}
]
}
]
}
Это класс Scala, который заполняет GenericRecordBuilder и преобразует его в байтовый массив:
package utils
import java.io.ByteArrayOutputStream
import org.apache.avro.{Schema, generic}
import org.apache.avro.generic.{GenericData, GenericDatumWriter}
import org.apache.avro.io.EncoderFactory
import org.apache.avro.generic.GenericRecordBuilder
object CheckRecBuilder extends App {
val avroSchema: Schema = new Schema.Parser().parse(this.getClass.getResourceAsStream("/data/myschema.avsc"))
val recordBuilder = new GenericRecordBuilder(avroSchema)
recordBuilder.set("t_name", "X")
recordBuilder.set("t_num", 100)
recordBuilder.set("t_arr", ???)
val record = recordBuilder.build()
val w = new GenericDatumWriter[GenericData.Record](avroSchema)
val outputStream = new ByteArrayOutputStream()
val e = EncoderFactory.get.binaryEncoder(outputStream, null)
w.write(record, e)
val barr = outputStream.toByteArray
println("End")
}