web-dev-qa-db-ja.com

Apache Avroスキーマを複数のファイルに分割できますか?

できます、

{
    "type": "record",
    "name": "Foo",
    "fields": [
        {"name": "bar", "type": {
            "type": "record",
            "name": "Bar",
            "fields": [ ]
        }}
    ]
}

それはうまくいきますが、スキーマを次のような2つのファイルに分割するとします。

{
    "type": "record",
    "name": "Foo",
    "fields": [
        {"name": "bar", "type": "Bar"}
    ]
}

{
    "type": "record",
    "name": "Bar",
    "fields": [ ]
}

Avroにはこれを行う機能がありますか?

24
Owen

はい、可能です。

私は、Javaプロジェクトで、avro-maven-pluginに共通のスキーマファイルを定義することでそれを実行しました。例:

search_result.avro:

{"namespace": "com.myorg.other",
 "type": "record",
 "name": "SearchResult",
 "fields": [
     {"name": "type", "type": "SearchResultType"},
     {"name": "keyWord",  "type": "string"},
     {"name": "searchEngine", "type": "string"},
     {"name": "position", "type": "int"},
     {"name": "userAction", "type": "UserAction"}
 ]
}

search_suggest.avro:

{"namespace": "com.myorg.other",
 "type": "record",
 "name": "SearchSuggest",
 "fields": [
     {"name": "suggest", "type": "string"},
     {"name": "request",  "type": "string"},
     {"name": "searchEngine", "type": "string"},
     {"name": "position", "type": "int"},
     {"name": "userAction", "type": "UserAction"},
     {"name": "timestamp", "type": "long"}
 ]
}

user_action.avro:

{"namespace": "com.myorg.other",
 "type": "enum",
 "name": "UserAction",
 "symbols": ["S", "V", "C"]
}

search_result_type.avro

{"namespace": "com.myorg.other",
 "type": "enum",
 "name": "SearchResultType",
 "symbols": ["O", "S", "A"]
}

avro-maven-plugin設定:

<plugin>
    <groupId>org.Apache.avro</groupId>
<artifactId>avro-maven-plugin</artifactId>
<version>1.7.4</version>
    <executions>
    <execution>
        <phase>generate-sources</phase>
        <goals>
        <goal>schema</goal>
        </goals>
    <configuration>
     <sourceDirectory>${project.basedir}/src/main/resources/avro</sourceDirectory>
         <outputDirectory>${project.basedir}/src/main/Java/</outputDirectory>
     <includes>
         <include>**/*.avro</include>
     </includes>
     <imports>
              <import>${project.basedir}/src/main/resources/avro/user_action.avro</import>
              <import>${project.basedir}/src/main/resources/avro/search_result_type.avro</import>
     </imports>
       </configuration>
     </execution>
</executions>
</plugin>
35
AlexTiunov

1つのファイル内に複数のスキーマを定義することもできます。

schemas.avsc:

[
{
    "type": "record",
    "name": "Bar",
    "fields": [ ]
},
{
    "type": "record",
    "name": "Foo",
    "fields": [
        {"name": "bar", "type": "Bar"}
    ]
}
]

複数の場所でスキーマを再利用したい場合、これは非常に良いことではありませんが、私の意見では可読性と保守性が大幅に向上します。

22
Michael

私の推測では、あなたの動機は(私自身のように)スキーマ定義を構造化し、コピーと貼り付けエラーを回避することです。

そのためには、 Avro IDL を使用することもできます。より高いレベルでavroスキーマを定義できます。タイプの再利用は可能です 同じファイル内 および 複数のファイル間

.avsc-filesを生成するには、次を実行します。

$ Java -jar avro-tools-1.7.7.jar idl2schemata my-protocol.avdl

結果の.avsc-filesは最初の例とほとんど同じように見えますが、.avdlから生成されるため、冗長なjson形式で失われることはありません。

5
Fabian Braun

Pom.xmlでのインポートの順序が重要です。残りを処理する前に、まずサブタイプをインポートする必要があります。

<imports>
    <import>${project.basedir}/src/main/resources/avro/Bar.avro</import>
    <import>${project.basedir}/src/main/resources/avro/Foo.avro</import>
</imports>

これにより、codegenの発行がブロックされなくなりますundefined name: Bar.avroエラー。

2
Jack Yeh

再利用するオブジェクトスキーマを最初に記述したavro-mavenプラグインにavscファイルをインポートする必要があります

<plugin>
<groupId>org.Apache.avro</groupId>
<artifactId>avro-maven-plugin</artifactId>
<version>${avro.maven.plugin.version}</version>
<configuration>
    <stringType>String</stringType>
</configuration>
<executions>
    <execution>
        <phase>generate-sources</phase>
        <goals>
            <goal>schema</goal>
        </goals>
        <configuration>
            <sourceDirectory>src/main/Java/com/xyz/avro</sourceDirectory> // Avro directory
            <imports>
                <import>src/main/Java/com/xyz/avro/file.avsc</import> // Import here
            </imports>
        </configuration>
    </execution>
</executions>
0
blueberry

私がこれまでに理解できたことから、違います。

これを行うための独自の方法をここにコーディングした人についての良い記事があります:

http://www.infoq.com/articles/ApacheAvro

0
Cargo23