我正在尋找一種方法將POJO以通用方式轉換爲avro對象。實施應該對POJO級別的任何變化都很有效。我已經實現了它,但明確填寫了avro記錄(請參見下面的示例)。從POJO到Avro記錄的通用轉換
有沒有辦法擺脫硬編碼的字段名稱,只需填寫對象的AVO記錄?反射是唯一的方法,還是具有開箱即用的功能?
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);
}
}
爲什麼不使用[Avro公司的ReflectDatumWriter(HTTP://計算器.com/questions/11866466/using-apache-avro-reflect)來序列化POJO? –
我在hadoop上下文中使用avro。對於序列化我想使用AvroParquetOutputFormat – fab
一個低效的方法會有[ReflectDatumWriter寫入POJO到字節,然後GenericDatumReader讀取字節到GenericRecord](http://stackoverflow.com/questions/26435299/write-pojos-to-parquet -file-使用反射)。 –