You can use your own custom stateful serialization for OBJECT fields creating
a serialization factory that implements Serialization.
As an example, you can take a look to
AvroFieldSerialization.
Implementing FieldConfigurable your serialization factory will receive
the metadata associated with the OBJECT field to be serialized.
Note how the AvroFieldSerialization's state is retrieved from the field's properties avro.schema and avro.reflection
public class AvroFieldSerialization<T> implements Serialization<T>,FieldConfigurable{
private Schema schema;
private boolean isReflect;
public AvroFieldSerialization(){
}
@Override
public Deserializer<T> getDeserializer(Class<T> clazz) {
return new AvroFieldDeserializer<T>(schema, isReflect);
}
@Override
public Serializer<T> getSerializer(Class<T> clazz) {
return new AvroFieldSerializer(schema, isReflect);
}
@Override
public void setFieldProperties(Map<String,String> properties) {
schema = Schema.parse(properties.get("avro.schema"));
String r = properties.get("avro.reflection");
isReflect = (r != null) && Boolean.parseBoolean(r);
}
There exist 4 types of built-in serializations supported in Pangool for OBJECT fields. However, any other custom serialization can be added, as explained above. Let's show how to define fields with them:
List<Field> fields = new ArrayList<Field>();
fields.add(Field.createObject("my_writable", TextLongWritable.class);
Schema schema = new Schema("schema", fields);
Tuple tuple = new Tuple(schema);
tuple.set("my_writable",new TextLongWritable("eric", 89L));
List<Field> fields = new ArrayList<Field>();
fields.add(Fields.createAvroField("my_avro_field", myAvroSchema));
Schema schema = new Schema("schema", fields);
Tuple tuple = new Tuple(schema);
Record avroRecord = new Record(myAvroSchema); //Avro Record
tuple.set("my_avro_field", avroRecord);
List<Field> fields = new ArrayList<Field>();
fields.add(Field.createObject("my_thrift_field", MyThrifObject.class));
Schema schema = new Schema("schema", fields);
Tuple tuple = new Tuple(schema1);
tuple.set("my_thrift_field",new MyThriftObject());
List<Field> fields = new ArrayList<Field>();
fields.add(Field.createObject("my_protostuff_field", MyProtoStuffObject.class));
Schema schema = new Schema("schema", fields);
Tuple tuple = new Tuple(schema);
tuple.set("my_protostuff_field",new MyProtostuffObject());
Schema tupleSchema = new Schema(...);
List<Field> fields = new ArrayList<Field>();
fields.add(Fields.createTupleField("my_tuple_field", tupleSchema));
Schema metaTupleSchema = new Schema("schema", fields);
Tuple tuple = new Tuple(tupleSchema);
...
Tuple metaTuple = new Tuple(metaTupleSchema);
metaTuple.set("my_tuple_field", tuple);