You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:15:01