5

次のような 2 つ (またはそれ以上) の異なるレコードの結合を含むレコードで構成される Avro スキーマを定義しました。

{
  "type":"record",
  "name":"MyCompositeRecord",
  "fields":
  [
    {"name":"SomeCommonData","type":"string"},
    {"name":"MoreCommonData","type":"float"},
    {"name":"CompositeRecord","type":
      [
        {
          "type":"record",
          "name":"FirstOption",
          "fields":
          [
            {"name":"x","type":"string"},
            {"name":"y","type":"long"}
          ]
        },
        {
          "type":"record",
          "name":"SecondOption",
          "fields":
          [
            {"name":"z","type":"int"},
            {"name":"w","type":"float"},
            {"name":"m","type":"double"},
            {"name":"l","type":"boolean"}
          ]
        }
      ]
    }
  ]
}

あまり明確に見えませんが、理解していただければ幸いです。いくつかのデータ ("SomeCommonData" と "MoreCommonData") で構成されるレコードと、2 つの異なるタイプのレコード ("FirstOption" と "SecondOption") の和集合があります。 . シリアル化/逆シリアル化時に、2 つのサブレコードのいずれかを作成し、「MyCompositeRecord」をシリアル化できるはずです。

一般的なレコードのみを使用することを計画しているため、スキーマのコードを生成しようとはしていません。ただし、そのような一般的なレコードをシリアル化できるかどうか、またどのようにシリアル化できるかはわかりません。オンラインで例が見つかりません。Javaを使用してシリアライズ/デシリアライズします。次のように、スキーマのライター/リーダーを作成できました。

Schema.Parser parser = new Schema.Parser();
Schema schema = parser.parse(COMPOSITE_SCHEMA);
DatumWriter<GenericRecord> writer = new GenericDatumWriter<>(schema);
DatumReader<GenericRecord> reader = new GenericDatumReader<>(schema);
GenericRecord datum = new GenericData.Record(schema);

ここから実際にレコードを作成する方法についてのアイデアはありますか?

ありがとう

4

1 に答える 1

2

基本的にユニオンの場合、他のフィールドを設定するのと同じです:

GenericRecord datum = new GenericData.Record(schema);

datum.set(1, data);

ここで、1 は Union フィールド番号、data は設定される値です。

AvroEditor - HelperのgetDefaultValueを 見ると、各 Avro タイプに使用するデフォルト値が表示されます。配列はGenericArrayを実装する必要があります。

于 2013-04-25T08:45:41.287 に答える