2017-02-27 7 views
0

Apacheのavro-toolsパッケージを使用して、私はJavaクラスから.avscファイルを生成しました。私はReflectDataを私のメインクラスに指摘し、それを使ってスキーマを出力しました。問題は数多くありますが、スキーマが同じクラスによって生成されたにもかかわらず、基本的に私の問題はAvroファイルを作成できません。Avroエラー:マップフィールドの「Unknown Union Branch」

たJavaのコードは次のとおりです。 Schema x = ReflectData.AllowNull.get().getSchema(MessageEnvelope.class);

だから私は、ファイルに上記の出力を貼り付けると、エラーが発生しているmsgEnvelope.avsc

スキーマファイルの行は、それを呼び出す:

{ 
    "type": "record", 
    "name": "MessageEnvelope", 
    "namespace": "data.decoder", 
    "fields": [ 
    { 
     "name": "headers", 
     "type": [ 
     "null", 
     { 
      "type": "map", 
      "values": "string" 
     } 
     ], 
     "default": null 
    }, 
.... 
} 

私のJSONデータスキーマのこの部分に対応する部分がある:

{"headers": {"idno":"123", "maker":"xyz"}} 

avro-toolsを実行すると、org.apache.avro.AvroTypeException: Unknown union branch idnoが生成されます。headersに可変数のキーと値のペアが含まれるようにすることが目標です。

は、そのエラーを生成するために、私はあなたが提供することができます任意の助けてくれてありがとうを java -jar avro-tools.jar fromjson --schema-file msgEnvelope.avsc tgtJson.json

を走りました!

+0

さらに、スキーマを使用すると、Avroの「ランダムデータジェネレータ」を使用してもエラーが発生します。スキーマが問題ですか? 'java -jar avro-tools.jar random --schema-file msgEnvelope.avsc --count 10。/ randomFromAVSC' –

答えて

0

私はそのすべてがjsonのためだと思います。ここで

は一例です:

Javaクラス:

public class MessageEnvelope { 
    Map<String, String> headers; 

    public Map<String, String> getHeaders() { 
     return headers; 
    } 

    public void setHeaders(Map<String, String> headers) { 
     this.headers = headers; 
    } 
} 

アブロスキーマ:

{ 
    "type":"record", 
    "name":"MessageEnvelope", 
    "namespace":"data.decoder", 
    "fields":[{ 
     "name":"headers", 
     "type":[ 
      "null", 
      {"type":"map","values":"string"} 
     ], 
     "default":null 
    }] 
} 

JSONデータ:

{ 
    "headers":{ 
     "map":{ 
      "maker":"xyz", 
      "idno":"123" 
     } 
    } 
} 

私はあなたがやったようjava -jar avro-tools-1.8.1.jar fromjson --schema-file msgEnvelope.avsc msgEnvelope.json呼び出しますそして例外は見られません。

私が使ったのと同じjsonを試してください。