Как связать одну схему 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...
проверьте эту ссылку для получения более подробной информации