Как объявить сущность типа объекта в схеме avro - PullRequest
0 голосов
/ 15 января 2019

У меня есть объект JSON, часть которого выглядит следующим образом:

{
  "bounding_box": {
    "coordinates": [
      [
        [
          -74.026675,
          40.683935
        ],
        [
          -74.026675,
          40.877483
        ]
      ]
    ],
    "type": "Polygon"
  }
}

Здесь координаты отправляются в виде массива Object . Теперь для этого объекта JSON я хочу создать схему avro (файл .avsc), которая на данный момент выглядит следующим образом:

{
    "name": "bounding_box",
    "type": {
        "namespace": "my.tweet.stream",
        "type": "record",
        "name": "BoundingBox",
        "fields": [{
                "name": "coordinates",
                "type": {
                    "type": "array",
                    "items": "object"
                }
            },
            {
                "name": "type",
                "type": ["string", "null"]
            }
        ]
    }
}

Однако с текущей схемой я получаю следующую ошибку:

Выполнить генерацию-идентификатора цели org.apache.avro: avro-maven-plugin: 1.8.1: сбой схемы: неопределенное имя: «объект»

Может кто-нибудь помочь, как мне указать java.lang.Object тип в схеме avro?

Спасибо.

1 Ответ

0 голосов
/ 16 января 2019

Avro является кросс-языковым и поэтому не имеет отображения java.lang.Object, только типы record, которые могут быть вложенными.

Вы можете вкладывать массивы (я сделал только два уровня, но у вас должно быть больше)

В IDL (payload.avdl)

@namespace("com.example.mycode.avro")
protocol ExampleProtocol {
  record BoundingBox {
    array<array<double>> coordinates;
   }

  record Payload {
    BoundingBox bounding_box;
    union{null, string} type = null;
  }
}

Или в AVSC

генерируется с java -jar ~/Applications/avro-tools-1.8.1.jar idl2schemata payload.avdl

{
  "type" : "record",
  "name" : "Payload",
  "namespace" : "com.example.mycode.avro",
  "fields" : [ {
    "name" : "bounding_box",
    "type" : {
      "type" : "record",
      "name" : "BoundingBox",
      "fields" : [ {
        "name" : "coordinates",
        "type" : {
          "type" : "array",
          "items" : {
            "type" : "array",
            "items" : "double"
          }
        }
      } ]
    }
  }, {
    "name" : "type",
    "type" : [ "null", "string" ],
    "default" : null
  } ]
}
...