Я использую JsonRowSerializationSchema
для сериализации Flink's Row в JSON. У сериализации временных меток SQL есть проблемы с часовыми поясами.
val row = new Row(1)
row.setField(0, new Timestamp(0))
val tableSchema = TableSchema
.builder
.field("c", DataTypes.TIMESTAMP(3).bridgedTo(classOf[Timestamp]))
.build
val serializer = JsonRowSerializationSchema.builder()
.withTypeInfo(tableSchema.toRowType)
.build()
println(new String(serializer.serialize(row)))
{c: 1969-12-31T16: 00: 00Z}
Я вижу, что он использует PST
(местный часовой пояс) для интерпретации метки времени, но затем выводит UTC
(см. Z
в выводе)
Если я сделаю TimeZone.setDefault(TimeZone.getTimeZone("UTC"))
, он напечатает {"c":"1970-01-01T00:00:00Z"}
. Мои временные метки созданы для времени UTC, и я хочу, чтобы Flink интерпретировал их как UTC.
Я проверяю реализацию Flink, действуют следующие два метода.
private JsonNode convertLocalDateTime(ObjectMapper mapper, JsonNode reuse, Object object) {
return mapper.getNodeFactory()
.textNode(RFC3339_TIMESTAMP_FORMAT.format((LocalDateTime) object));
}
private JsonNode convertTimestamp(ObjectMapper mapper, JsonNode reuse, Object object) {
Timestamp timestamp = (Timestamp) object;
return convertLocalDateTime(mapper, reuse, timestamp.toLocalDateTime());
}
Похоже, что реализация жестко запрограммирована, есть ли способ указать Flink использовать UTC
без изменения системного времени?