Как связать одну схему avro внутри другой

Мне нужно указать Stduent.avsc внутри другой схемы

 {
 "type" : "record",
 "namespace" : "data.add",
 "name" : "Student",
 "fields" : [
   { "name" : "Name" , "type" : 
    "string" },
   { "name" : "Age" , "type" : 
    "int" }
  ]

}

Мне нужно сослаться на указанную выше схему ученика внутри схемы адреса avro

 {
"type" : "record",
"namespace" : "data.add",
"name" : "Address",
 "fields" : [
   { "name" : "student" , "type" : 
"Student" }
 ]
}

Приведенное выше вызывает ошибку сборки gradle, как исправить.. обе схемы в одной папке

4 ответа

{ "тип": "запись", "пространство имен": "data.add", "имя": "адрес", "поля": [ { "имя": "студент", "тип": "data.add. Студент " } ] } Так работал

Извините, если я опоздал на вечеринку, но мне кажется, что и плагин maven avro, и компилятор avro-tools не определяют порядок зависимостей при загрузке, но добьются успеха, если вы сами закажете их в командной строке. У меня есть пример, демонстрирующий это из ваших образцов файлов в стандартной структуре каталогов maven.

Когда я сначала помещаю схему без зависимостей в командную строку, это удается:

      java -jar /path/to/avro-tools-1.11.0.jar \
    compile schema  \
    src/main/avro/student.avsc \
    src/main/avro/address.avsc \
    target/generated-sources/avro

ls target/generated-sources/avro/data/add/*
target/generated-sources/avro/data/add/Address.java target/generated-sources/avro/data/add/Student.java

Когда я сначала помещаю схему с зависимостями в командную строку, она терпит неудачу:

      java -jar /path/to/avro-tools-1.11.0.jar \
    compile schema  \
    src/main/avro/address.avsc \
    src/main/avro/student.avsc \
    target/generated-sources/avro
Exception in thread "main" org.apache.avro.SchemaParseException: "data.add.Student" is not a defined name. The type of the "student" field must be a defined name or a {"type": ...} expression.
    at org.apache.avro.Schema.parse(Schema.java:1676)
    at org.apache.avro.Schema$Parser.parse(Schema.java:1433)
    at org.apache.avro.Schema$Parser.parse(Schema.java:1396)
    at org.apache.avro.tool.SpecificCompilerTool.run(SpecificCompilerTool.java:154)
    at org.apache.avro.tool.Main.run(Main.java:67)
    at org.apache.avro.tool.Main.main(Main.java:56)

У нас был сценарий, в котором нам нужно было использовать массив BasketItem в Basket.

Итак, мы определили схему BasketItem, как показано ниже.

          {
    "type": "record",
    "name": "BasketItem",
    "namespace": "com.demo",
    "fields": [{
            "name": "id",
            "type": "string"
        },
        {
            "name": "shortDesc",
            "type": [
                "null",
                "string"
            ],
            "default": null
        },
        {
            "name": "longDesc",
            "type": [
                "null",
                "string"
            ],
            "default": null
        },
        {
            "name": "requestedQuantity",
            "type": [
                "null",
                "string"
            ],
            "default": null
        }
    ]
  }

И затем этот тип BasketItem используется в схеме Basket со ссылкой на пространство имен.

      {
    "name": "Basket",
    "type": "record",
    "namespace": "com.demo",
    "fields": [{
            "name": "id",
            "type": "string"
        },
        {
            "name": "creationTimeStamp",
            "type": "string"
        },
        {
            "name": "basketItems",
            "type": {
                "type": "array",
                "items": {
                    "type": "com.demo.BasketItems",
                    "name": "basketItem"
                }
            }
        }
    ]
}

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

Для Maven можно использовать конфигурацию импорта.

В этом примере включите следующее в свой pom.xml в разделеproject/build/plugins

      <plugin>
    <groupId>org.apache.avro</groupId>
    <artifactId>avro-maven-plugin</artifactId>
    <version>${avro.version}</version>
    <executions>
        <execution>
            <phase>generate-sources</phase>
            <goals>
                <goal>schema</goal>
            </goals>
            <configuration>
                <imports>
                    <import>${project.basedir}/path/to/student.avsc</import>
                </imports>
                <sourceDirectory>${project.basedir}/path/to/schema/files</sourceDirectory>
                <includes>
                    <include>*.avsc</include>
                </includes>
                <outputDirectory>${project.basedir}/path/to/target/</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

тогда вы сможете выполнить сборку maven...

проверьте эту ссылку для получения более подробной информации

https://feitam.es/use-of-avro-maven-plugin-with-complex-schemas-defined-in-several-files-to-be-reused-in-различные-типизированные-messages/

Другие вопросы по тегам