Szukam sposobu na konwersję POJO na obiekt avro w sposób ogólny. Implementacja powinna być odporna na wszelkie zmiany w klasie POJO. Osiągnąłem to, ale wyraźnie zapełniłem rekord avro (patrz przykład poniżej).Ogólna konwersja z POJO do rekordu Avro
Czy istnieje sposób na pozbycie się nazw zakodowanych pól i wypełnienie rekordu avro z obiektu? Czy odbicie jest jedynym sposobem, czy też avro dostarcza tę funkcjonalność po wyjęciu z pudełka?
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.apache.avro.Schema;
import org.apache.avro.generic.GenericData.Record;
import org.apache.avro.reflect.ReflectData;
public class PojoToAvroExample {
static class PojoParent {
public final Map<String, String> aMap = new HashMap<String, String>();
public final Map<String, Integer> anotherMap = new HashMap<String, Integer>();
}
static class Pojo extends PojoParent {
public String uid;
public Date eventTime;
}
static Pojo createPojo() {
Pojo foo = new Pojo();
foo.uid = "123";
foo.eventTime = new Date();
foo.aMap.put("key", "val");
foo.anotherMap.put("key", 42);
return foo;
}
public static void main(String[] args) {
// extract the avro schema corresponding to Pojo class
Schema schema = ReflectData.get().getSchema(Pojo.class);
System.out.println("extracted avro schema: " + schema);
// create avro record corresponding to schema
Record avroRecord = new Record(schema);
System.out.println("corresponding empty avro record: " + avroRecord);
Pojo foo = createPojo();
// TODO: to be replaced by generic variant:
// something like avroRecord.importValuesFrom(foo);
avroRecord.put("uid", foo.uid);
avroRecord.put("eventTime", foo.eventTime);
avroRecord.put("aMap", foo.aMap);
avroRecord.put("anotherMap", foo.anotherMap);
System.out.println("expected avro record: " + avroRecord);
}
}
Dlaczego nie używać [Avro za ReflectDatumWriter] (http: // stackoverflow .com/questions/11866466/using-apache-avro-reflect) do serializacji POJO? –
Używam avro w kontekście hadoop. Serializacja Chciałbym użyć AvroParquetOutputFormat – fab
Nieefektywne podejście miałby [ReflectDatumWriter napisać POJO do bajtów następnie GenericDatumReader odczytuje bajty do GenericRecord] (http://stackoverflow.com/questions/26435299/write-pojos-to-parquet -file-using-reflection). –