2016-08-15 3 views
0

다음 질문을 따르십시오 : Avro serialisation cast error in ScalaAvro로 스칼라 케이스 클래스를 직렬화하는 방법은 무엇입니까?

Avro를 사용하여 Scala case 클래스를 serialize하는 가장 좋은 방법은 무엇입니까?

def serializeSubmapRecord(record: MyRecord): Array[Byte] = { 
    val out = new ByteArrayOutputStream() 
    val encoder = EncoderFactory.get.binaryEncoder(out, null) 
    val writer = new GenericDatumWriter[GenericRecord](avro_schema) 
    val r = new GenericData.Record(avro_schema); 
    r.put("my_number", 1); 
    writer.write(r, encoder) 
    encoder.flush 
    out.close 
    out.toByteArray 
    } 

을 아 브로 스키마

{"namespace": "", 
    "type": "record", 
    "name": "MyRecord", 
    "fields": [ 
    {"name": "my_number", "type": "int"} 
    ] 
} 

그러나 나는 이런 식으로 뭔가하고 싶은 곳 :

case class MyRecord(my_number: Int) 
val record = new MyRecord(1) 

def serializeSubmapRecord(record: MyRecord): Array[Byte] = { 
val out = new ByteArrayOutputStream() 
val encoder = EncoderFactory.get.binaryEncoder(out, null) 
val writer = new GenericDatumWriter[MyRecord](avro_schema) 
writer.write(record, encoder) 
encoder.flush 
out.close 
out.toByteArray 

을} 여기

내가 지금 뭘하는지입니다

코드의 마지막 비트는 링크 된 질문을 제외합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

1

제가 생각하는 것은 일반적인 것 대신 SpecificDatumWriter입니다.

case class MyRecord(my_number: Int) 

val record = new MyRecord(1) 

def serializeSubmapRecord(record: MyRecord): Array[Byte] = { 
    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    Encoder encoder = EncoderFactory.get().directBinaryEncoder(out, null); 

    // specific writer 
    SpecificDatumWriter<MyRecord> writer = new SpecificDatumWriter<MyRecord>(avro_schema); 
    writer.write(record, encoder); 
    encoder.flush(); 
    ByteBuffer serialized = ByteBuffer.allocate(out.toByteArray().length); 
    serialized.put(out.toByteArray()); 
    return serialized.array(); 
} 
2

또 다른 옵션은 scala 라이브러리 인 avro4s을 사용하는 것입니다. 면책 조항 : 그것은 내 프로젝트입니다.

그래서 당신은이 같은 스키마를 만들 수 있습니다

case class MyRecord(my_number: Int) 

val schema = AvroSchema[MyRecord] 

val record = new MyRecord(1) 

을 또는 귀하의 질문처럼 바이트의 배열에 쓰는 :

val baos = new ByteArrayOutputStream() 
val os = AvroOutputStream.data[MyRecord](baos) 
os.write(record) 
os.close() 
+0

어디에서'Pizza' 오는가? 그 라인이 어떤 것와도 상호 작용하는 것을 보지 못합니다 ... –

+0

미안 해요, 샘플은 원래 붙여 넣기를 복사 할 때 MyRecord로 이름을 바꾼 Pizza라는 케이스 클래스를 사용했습니다 - 나는 지금 편집 할 것 하나를 놓친 것 같습니다. – monkjack

관련 문제