2015-03-02 74 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