如何使用apache avro生成无架构的avro文件?

时间:2015-03-02 11:17:23

标签: java apache avro

我正在使用Apache avro进行数据序列化。由于数据具有固定的模式,因此我不希望模式成为序列化数据的一部分。在以下示例中,schema是avro文件“users.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文件吗?

2 个答案:

答案 0 :(得分:5)

Here您会找到一个全面的解释如何使用Apache Avro解释如何实现无模式序列化。 随播测试活动会显示您可能期望的一些性能数据。

code is on GitHub:示例和测试类显示如何将数据读取器和编写器与Avro自己生成的Stub类一起使用。

答案 1 :(得分:1)

应该可行。

给定编码器,您可以使用DatumWriter将数据直接写入ByteArrayOutputStream(然后可以将其写入java.io.File)。

以下是Scala入门的方法(来自Salat-Avro):

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