Avro Schema如何定义MMDDYYYYHHMMSS格式的timestamp?
问题结论
你给出的Avro Schema定义不可用,原因如下:
- Avro官方规范中,
timestamp-millis逻辑类型绑定long基础类型,存储的是Unix纪元(1970-01-01 00:00:00 UTC)以来的毫秒数值,标准实现不支持date-format自定义属性,这个属性会被绝大多数Avro序列化/反序列化工具直接忽略,无法实现你要的MMDDYYYYHHMMSS格式转换。 - 你给出的Schema本身存在语法错误:
"logicalType": "timestamp-millis"行末尾缺少逗号,直接使用会触发JSON解析报错。
可选实现方案
根据你的业务需求可选择对应方案:
- 若要求存储的内容严格为
MMDDYYYYHHMMSS格式,且兼容所有Avro工具:- 优先选择
string基础类型,不在Schema中添加时间相关的逻辑类型定义,直接在业务代码层实现时间对象和MMDDYYYYHHMMSS格式字符串的相互转换,Schema写法为:{"type": "string"} - 若要求存储为数字类型,可直接定义为
long基础类型,同样不在Schema中添加logicalType属性,业务代码自行实现MMDDYYYYHHMMSS格式数值和时间对象的转换即可,注意该数值不是标准Unix时间戳,其他无感知的工具读取时会将其识别为普通数值。
- 优先选择
- 若希望底层存储标准Unix时间戳(兼容通用时间处理工具),仅在业务侧读写时自动转换为
MMDDYYYYHHMMSS格式:- 可以保留
timestamp-millis逻辑类型定义,同时在Schema中保留自定义的date-format属性作为扩展标记,自行实现Avro自定义序列化/反序列化转换逻辑,识别该扩展属性完成格式转换,注意该转换逻辑仅在你自己的业务环境中生效,其他标准Avro工具读取时仍会按照标准时间戳处理。
- 可以保留
内容的提问来源于stack exchange,提问作者dataviews
相关产品推荐
相关产品推荐

