Кафка Авро - Точное изменение для значения с плавающей запятой - PullRequest
0 голосов
/ 09 октября 2019

Мы перемещаем записи json из раздела nifi в раздел kakfa, используя реестр схем.

Схема:

  "type": "record",
  "name": "Name",
  "fields": [{
            "name": "latitude",
            "type": [
              "null",
              "float"
            ]
          },
          {
            "name": "longitude",
            "type": [
              "null",
              "float"
            ]
          }]

Пример 1 -

ВводЗапись: {"import_latitude":38.090925000000,"import_longitude":8.677760000000}

Выходная запись (тема kafka): {"latitude":{"float":38.090923},"longitude":{"float":8.67776}}

38.090925000000 -> 38.090923

Пример 2 -

Входная запись: {"import_latitude":38.090926000000,"import_longitude":8.677760000000}

Выходная запись (тема kafka): {"latitude":{"float":38.090927},"longitude":{"float":8.67776}}

Это проблема со схемой kafka avro?

1 Ответ

1 голос
/ 15 октября 2019

Похоже, вы получаете ожидаемые результаты! Это не связано с Avro, но с 32-битной точностью с плавающей запятой (т. Е. 6/7 значащих цифр).

Вы можете видеть это в Java независимо от того, как вы смотрите на float:

System.out.println(Float.parseFloat("38.090925000000")); // 38.090923
System.out.println((float) 8.677760000000d); // 8.67776
System.out.println(38.090926000000f); // 38.090927
System.out.println(new Double(8.677760000000).floatValue()); // 8.67776

Похоже, ваши географические координаты JSON имеют 8 или 14 значащих цифр.

Если вам нужно, вы можете использовать Avro DOUBLE (15/16 значащих цифр) вместо FLOAT, имея в виду, что некоторые десятичные текстовые представления не могут быть точно представлены в двоичном виде, независимо от того, сколько битов вы назначите.

Для многих аспектов представление long / lat в плавающей запятой достаточно точно , а двойное число является избыточным.

...