Теперь я столкнулся с проблемой преобразования записи сообщения Kafka типа long для наносекунд (19 цифр) в строковую метку времени с миллисекундами. Сообщения поступают в формате Avro и содержат разные схемы (поэтому мы не можем статически определить одну схему), хранящиеся в Confluent Schema Registry. Текущий процесс:
1) ConsumeKafkaRecord_2_0, который читает сообщение и сохраняет схему Avro, поступающую из реестра Confluent Schema Registry, в атрибут avro.schema.
2) UpdateAttribute, который ищет образец записи timestamp в avro.schema и добавляет "logicalType": "timestamp-micros" (потому что я не могу найти тип timestamp-nanos в спецификации Avro)
3) ConvertRecord, который преобразует файл потока Avro с использованием avro.schema в JSON. Он использует логический тип, присвоенный на предыдущем шаге, и преобразует 19 цифр в формат гггг-мм-дд ЧЧ: мм: СС.SSSSSS. Здесь проблема в том, что 19 цифр - это тип нанометки времени, который отсутствует в спецификации Avro, поэтому мы можем использовать только тип timestamp-micros и получать значения 51000+ лет.
4) ReplaceText - этот процессор дает нам обходной путь для проблемы, описанной выше, и мы заменяем значения шаблона 5-значного года на "правильное" datetime (с миллисекундами, потому что Java почему-то не может работать с микросекундами), используя и выражение: $ {'$ 1': toDate ('yyyyy-MM-dd HH: mm: ss.SSSSSS'): toNumber (): toString (): substring (0, 13): toNumber (): toDate (): format ('гггг-ММ-дд ЧЧ: мм: сс.ССС')}
После этого мы переходим к другим процессорам, обходной путь работает, но со странной проблемой - наши итоговые временные метки отличаются на несколько миллисекунд от того, что мы получаем в Kafka. Могу только догадываться, что это результат описанных выше преобразований. Вот почему мой вопрос: есть ли лучший способ обрабатывать 19-значные значения, поступающие в сообщениях Avro (схемы находятся в реестре Confluent Schema, шаблон для полей меток времени в схеме известен), чтобы они были преобразованы в правильные метки времени миллисекунды? Может быть, какая-то замена значения поля (подстрока из 13 цифр из 19-значного значения) в содержимом файла потока Avro на основе его схемы, которая встроена / хранится в атрибуте avro.schema?
Пожалуйста, дайте мне знать, если что-то неясно, и если требуются дополнительные сведения. Заранее большое спасибо!
whatever.SSSSSS
. Джува могла вернуть за это неожиданные милли. в своем выражении лица вы просто обрезаете последние три цифры. Итак, просто используйте подстроку или замените ... - person daggett   schedule 15.07.2019