Apache Avro 1.8.2的duration逻辑类型是否有对应API实现?
Apache Avro 1.8.2的"duration"逻辑类型:文档定义与库实现缺口
我刚好踩过这个坑!Avro 1.8.2的官方文档里确实明确了duration这个逻辑类型的规范:
该逻辑类型标注大小为12的Avro fixed类型,存储三个小端无符号整数,分别表示月、日、毫秒级别的时长。
但尴尬的是,不管是Java还是.Net的官方Avro库(对应1.8.2版本),都没有原生实现这个逻辑类型——也就是说,当你在Schema里标记一个fixed类型为duration时,库并不会自动帮你把它映射成对应的时长对象,只会当作普通的字节数组来处理。
给你分享下我当时的处理方式,算是临时的解决方案:
- 序列化侧:自己把月、日、毫秒这三个值转换成小端字节序,拼接成12字节的数组,再塞进Avro的fixed字段里。
- 反序列化侧:从fixed的字节数组里按顺序拆分出前4字节(月)、中间4字节(日)、最后4字节(毫秒),再转成对应的数值。
举个Java的简单实现示例(伪代码):
// 把自定义Duration对象序列化成符合规范的字节数组 public byte[] serializeCustomDuration(CustomDuration duration) { ByteBuffer buffer = ByteBuffer.allocate(12).order(ByteOrder.LITTLE_ENDIAN); buffer.putInt(duration.getMonths()); buffer.putInt(duration.getDays()); buffer.putLong(duration.getMilliseconds()); return buffer.array(); } // 从fixed字节数组反序列化成自定义Duration对象 public CustomDuration deserializeCustomDuration(byte[] fixedBytes) { ByteBuffer buffer = ByteBuffer.wrap(fixedBytes).order(ByteOrder.LITTLE_ENDIAN); int months = buffer.getInt(); int days = buffer.getInt(); long milliseconds = buffer.getLong(); return new CustomDuration(months, days, milliseconds); }
.Net里的思路也一样,用BitConverter或者BinaryReader处理小端字节序就行,注意BitConverter默认字节序,必要时手动调整字节顺序。
内容的提问来源于stack exchange,提问作者Russell Phillips
相关产品推荐
相关产品推荐

