2015-03-02 75 views
6

我正在使用Apache avro進行數據序列化。因爲數據有一個固定的模式,我不希望模式成爲序列化數據的一部分。在以下示例中,架構是avro文件「users.avro」的一部分。如何使用apache avro生成無模式的avro文件?

User user1 = new User(); 
user1.setName("Alyssa"); 
user1.setFavoriteNumber(256); 
User user2 = new User("Ben", 7, "red"); 
User user3 = User.newBuilder() 
     .setName("Charlie") 
     .setFavoriteColor("blue") 
     .setFavoriteNumber(null) 
     .build(); 

// Serialize user1 and user2 to disk 
File file = new File("users.avro"); 
DatumWriter<User> userDatumWriter = new SpecificDatumWriter<User>(User.class); 
DataFileWriter<User> dataFileWriter = new DataFileWriter<User (userDatumWriter); 
dataFileWriter.create(user1.getSchema(), new File("users.avro")); 
dataFileWriter.append(user1); 
dataFileWriter.append(user2); 
dataFileWriter.append(user3); 
dataFileWriter.close(); 

任何人都可以請告訴我如何在沒有嵌入架構的情況下存儲avro文件嗎?

回答

0

應該可行。

給定一個編碼器,您可以使用DatumWriter將數據直接寫入ByteArrayOutputStream(然後可以寫入java.io.File)。

下面是如何在斯卡拉開始(從Salat-Avro):

val baos = new ByteArrayOutputStream 
val encoder = EncoderFactory.get().binaryEncoder(baos, null) 
encoder.write(myRecord, encoder) 
2

Here你找到一個全面的如何,我解釋瞭如何使用Apache Avro的實現方案較少的序列化。 伴侶測試活動會顯示一些您可能期望的表現。

code is on GitHub:示例和測試類展示瞭如何將Data Reader和Writer與由Avro自己生成的Stub類一起使用。

+0

使用您在代碼中描述的方法是否可以指定編解碼器?即生成無模式Avro,例如,壓縮壓縮? – 2017-05-10 09:23:28