Apache Avro генерирует неправильную схему Avro из Java POJO с @AvroSchema - PullRequest
1 голос
/ 06 августа 2020

У меня есть простой POJO с датами, который будет сохранен как Avro в хранилище перед импортом в Google BigQuery. Даты преобразуются в длинные, и я пытаюсь использовать @AvroSchema, чтобы переопределить создание схемы для полей даты, чтобы BigQuery понимал, к какому типу относятся поля.

Простой POJO:

public class SomeAvroMessage implements Serializable {
    @AvroSchema("{\"type\":\"long\",\"logicalType\":\"timestamp-millis\"}")
    private long tm;
    @AvroSchema("{\"type\":\"long\",\"logicalType\":\"timestamp-millis\"}")
    private long created;

    public SomeAvroMessage() {
    }
}

В итоге получается следующая AVRO-схема:

{"type":"record","name":"SomeAvroMessage",
"namespace":"some.namespace",
"fields":[
      {"name":"tm","type":{"type":"long","logicalType":"timestamp-millis"}},
      {"name":"created","type":{"type":"long","logicalType":"timestamp-millis"}}
]}

Кажется, это неверно и должно быть просто {"name": "tm", "type": "long "," logicalType ":" timestamp-millis "}

Используется в Google Dataflow, а Apache Beam 2.22 записан в Java.

Я что-то упустил ?

Ответы [ 2 ]

0 голосов
/ 11 августа 2020

Как можно найти в документации :

Логический тип - это примитивный или сложный тип Avro с дополнительными атрибутами для представления производного типа. Атрибут logicalType всегда должен присутствовать для логического типа и представляет собой строку с именем одного из логических типов, перечисленных далее в этом разделе. Другие атрибуты могут быть определены для определенных логических типов.

В документации также приводится пример типа даты в схемах avro:

{
  "type": "int",
  "logicalType": "date"
}

В основном ваша схема правильная и каждый раз, когда вам нужно чтобы использовать какой-то логический тип, вы можете построить свою схему следующим образом.

0 голосов
/ 10 августа 2020

Значение {"name":"tm","type":{"type":"long","logicalType":"timestamp-millis"}} правильное. Если мы расширим его до более понятного псевдокода, это будет:

Field {
  name: "tm",
  type: Schema {
    type: "long",
    logicalType: "timestamp-millis"
  }
}

. Вы можете увидеть, что в поле есть name и type. type поля Avro должно быть схемой Avro. Поле logicalType находится внутри схемы, а не рядом с ней.

...