Apache Avro C++ 1.11是否支持local-timestamp-millis逻辑类型?
Apache Avro C++ 1.11 处理local-timestamp-millis逻辑类型问题
问题情况
- 使用Apache Avro C++ 1.11版本,尝试创建包含
local-timestamp-millis逻辑类型的文件 - 编译带该逻辑类型的JSON schema时,
compileJsonSchema函数无法识别此类型,逻辑类型返回值为NONE - 替换为
timestamp-millis时,逻辑类型可被正确识别并设置 - 库中没有对应本地时间戳的
LogicalType枚举值,想了解是否可以将local-timestamp-millis作为LogicalType::TIMESTAMP_MILLIS处理
编译Schema的代码
std::istringstream ist(json); avro::ValidSchema schema; avro::compileJsonSchema(ist, schema);
使用的JSON Schema输入
{ "type": "record", "name": "Test", "fields": [{ "type": "string", "name": "textField"},{ "type": {"type": "long", "logicalType": "local-timestamp-millis"}, "name": "DATE"}]}
解答
Avro C++ 1.11确实没内置支持local-timestamp-millis逻辑类型,这就是编译时逻辑类型返回NONE的原因。
至于能不能把它当LogicalType::TIMESTAMP_MILLIS用,得看你的业务场景:
- 从数据存储层面来说,两者都是用
long类型存储毫秒数,二进制格式完全一致,单纯做序列化/反序列化操作的话,这么处理不会损坏数据。 - 但要注意语义差异:
timestamp-millis是UTC绝对时间戳,带时区信息,对应唯一的绝对时间点;local-timestamp-millis是本地时间,不带时区,只表示“某时某分某秒”,不对应唯一的绝对时间。如果你的业务不涉及跨时区数据交互,或者全链路都统一使用同一个时区,临时这么处理可以正常工作;但如果涉及跨时区场景,这么做会导致时间语义混乱,出现数据错误。
如果需要长期支持local-timestamp-millis,有两种可行方案:
- 升级到Avro C++ 1.12及以上版本:1.12版本开始正式添加了
LOCAL_TIMESTAMP_MILLIS等本地时间相关的逻辑类型枚举 - 自定义逻辑类型处理:手动解析schema中的
logicalType字段,在序列化/反序列化时自行处理时间的转换逻辑,绕过库内置的逻辑类型判断
内容的提问来源于stack exchange,提问作者hannah_sinclair
相关产品推荐
相关产品推荐

