Java LocalDateTime与Avro映射方法及类型定义疑问
Java LocalDateTime 映射到 Avro 的问题解答
1. 你的Avro定义是否正确?
不正确。timestamp-millis逻辑类型要求底层必须是long类型,你当前使用int类型会引发时间戳溢出问题——int的最大值为2147483647(对应2038年1月19日),超过这个时间的毫秒级时间戳将无法被正确存储。
正确的Avro字段定义如下:
{ "name": "example", "type": ["null", {"type": "long", "logicalType": "timestamp-millis"}], "default": null }
2. 如何在Avro对象中设置值?
你当前的转换逻辑是正确的:将LocalDateTime转换为UTC时区的Instant后获取毫秒级时间戳。只需确保将得到的long类型时间戳赋值给对应Avro字段即可。
示例代码(假设生成的Avro类名为YourAvroClass):
LocalDateTime localDateTime = LocalDateTime.now(); long epochMillis = localDateTime.toInstant(ZoneOffset.UTC).toEpochMilli(); YourAvroClass avroObj = YourAvroClass.newBuilder() .setExample(epochMillis) .build();
3. Avro是否应该定义为Long类型?
是的。timestamp-millis逻辑类型的官方规范明确要求底层类型为long,用于存储从1970-01-01T00:00:00Z开始的毫秒数。使用int会存在范围限制,无法处理2038年之后的时间,因此必须使用long类型。
内容的提问来源于stack exchange,提问作者user1555190
相关产品推荐
相关产品推荐

