如何使用apache avro生成无模式的avro文件?

2022-09-04 22:35:05

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


答案 1

在这里,您可以找到一个全面的操作方法,其中我解释了如何使用Apache Avro实现无模式序列化。配套测试广告系列会显示一些您可能期望的效果数字。

代码在GitHub上:示例和测试类显示了如何将数据读取器和写入器与Avro本身生成的Stub类一起使用。


答案 2

应该是可行的。

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

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

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

推荐