일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- coursera
- RabbitMQ
- Elasticsearch
- confluent
- schema registry
- Kafka
- Logstash
- spring-batch
- spring-kafka
- scala
- enablekafkastreams
- kafkastreams
- reactive
- Slick
- aws
- scala 2.10
- avo
- spring-cloud-stream
- gradle
- springboot
- 한빛미디어
- kafkastream
- kafka interactive query
- Spring
- statestore
- play framework
- Elk
- 카프카
- 플레이 프레임워크
- kafka streams
- Today
- Total
b
Avro GenericRecord,SpecificRecord 본문
GenericRecord
{
"type": "record",
"namespace": "com.example",
"name": "user",
"fields": [
{
"name": "name",
"type": "string"
}
]
}다시피
GenericRecordBuilder builder = new GenericRecordBuilder(schemaString);
builder.set("name", "bistros");
GenericData.Record bistros = builder.build();
System.out.println(bistros);
System.out.println(bistros.getSchema());
// {"name": "bistros"}
// {"type":"record","name":"user","namespace":"com.example", "fields":[{"name":"name","type":"string"}]}
보시다시피 GenericRecordBuilder set(String fieldName, Object value) 를 통해서 값을 셋팅하기 때문에 불안하다.
SpecificRecord
하지만 SpecificRecord는 좀 다르다. avro schema를 기반으로 maven/gradle 플러기인으로 resources를 생성해보면 extends org.apache.avro.specific.SpecificRecordBase 를 통해서 똑같이 GenericData를 상속하고 있지만 6개 필드를 가진 Avro Schema 파일에서 약 550라인의 Class파일이생성된다. getter/setter/builder 등이 구현되어 있다.
요약)
Gradle Plugin을 이용해서 Class 파일을 만들어야 하지만 SpecificRecord를 사용하는 게 당연하다.
사족)
Confluent의 Kafka-Avro-Serializer는 default로 generic type을 읽고 쓰게 되어 있다.
properties.setProperty("specific.avro.reader", "true");
을 통해서 specific 모드를 활성화 해야 하고, 이것을 활성화 하면 내부적으로 사용하는 DatumReader를 SpecificDatumReader 으로 셋팅하다.
추가적으로 Streams 모드를 위해서는 아예 GenericAvroSerde, SpecificAvroSerde 2개의 Serde를 따로 제공해주고 있다.