2013-03-11 12 views
11

Mam dwa pytania:Avro ewolucja schematu

  1. to możliwe, aby korzystać z tego samego czytnika i analizowania zapisów, które zostały napisane z dwóch schematów, które są kompatybilne, na przykład Schema V2 ma tylko dodatkowe pole opcjonalne w porównaniu do Schema V1 i chcę, aby czytelnik zrozumiał obie rzeczy? Myślę, że odpowiedź brzmi: nie, ale jeśli tak, jak mam to zrobić?

  2. Próbowałem pisać rekord z Schema V1 i czytając go Schema V2, ale pojawia się następujący błąd:

    org.apache.avro.AvroTypeException: Znaleziono bla, bla spodziewa

Kiedyś Avro-1.7.3 oraz:

writer = new GenericDatumWriter<GenericData.Record>(SchemaV1); 
    reader = new GenericDatumReader<GenericData.Record>(SchemaV2, SchemaV1); 

Oto przykłady dwóch schematów (próbowałem dodanie nazw jak również, ale bez powodzenia).

Schema V1:

{ 
"name": "foo", 
"type": "record", 
"fields": [{ 
    "name": "products", 
    "type": { 
     "type": "array", 
     "items": { 
      "name": "product", 
      "type": "record", 
      "fields": [{ 
       "name": "a1", 
       "type": "string" 
      }, { 
       "name": "a2", 
       "type": {"type": "fixed", "name": "a3", "size": 1} 
      }, { 
       "name": "a4", 
       "type": "int" 
      }, { 
       "name": "a5", 
       "type": "int" 
      }] 
     } 
    } 
}] 
} 

Schema V2:

{ 
"name": "foo", 
"type": "record", 
"fields": [{ 
    "name": "products", 
    "type": { 
     "type": "array", 
     "items": { 
      "name": "product", 
      "type": "record", 
      "fields": [{ 
       "name": "a1", 
       "type": "string" 
      }, { 
       "name": "a2", 
       "type": {"type": "fixed", "name": "a3", "size": 1} 
      }, { 
       "name": "a4", 
       "type": "int" 
      }, { 
       "name": "a5", 
       "type": "int" 
      }] 
     } 
    } 
}, 
{ 
      "name": "purchases", 
      "type": ["null",{ 
        "type": "array", 
        "items": { 
          "name": "purchase", 
          "type": "record", 
          "fields": [{ 
            "name": "a1", 
            "type": "int" 
          }, { 
            "name": "a2", 
            "type": "int" 
          }] 
        } 
      }] 
}] 
} 

góry dzięki.

Odpowiedz

9

Napotkałem ten sam problem. Może to być błąd avro, ale prawdopodobnie można obejść, dodając "default": null do pola "purchase".

Sprawdź mój blog o szczegóły: http://ben-tech.blogspot.com/2013/05/avro-schema-evolution.html

+5

Wartości domyślne są koniecznością przy użyciu ewolucję schematu. Jeśli nie podasz wartości domyślnej dla pola, które jest obecne w schemacie czytnika, ale nie w schemacie programu piszącego, Avro nie może dowiedzieć się, jak utworzyć to nowe pole w analizowanej strukturze. – LiMuBei

0

Można zrobić przeciwieństwo tego. Oznacza, że ​​możesz parsować schemat danych 1 i zapisywać dane ze schematu 2. Beacause w czasie zapisu zapisuje dane do pliku i jeśli nie zapewniamy żadnego pola podczas czytania, to będzie w porządku. Ale jeśli piszemy mniej pola niż czytane, to nie rozpoznaje ono dodatkowego pola w czasie odczytu, więc spowoduje błąd.

0

Najlepszym sposobem jest mapowanie schematu w celu zachowania schematu, np. Rejestru Confluent Avro schema.

Kluczowe Aways przyjmowaniu:

1. Unlike Thrift, avro serialized objects do not hold any schema. 
2. As there is no schema stored in the serialized byte array, one has to provide the schema with which it was written. 
3. Confluent Schema Registry provides a service to maintain schema versions. 
4. Confluent provides Cached Schema Client, which checks in cache first before sending the request over the network. 
5. Json Schema present in “avsc” file is different from the schema present in Avro Object. 
6. All Avro objects extends from Generic Record 
7. During Serialization : based on schema of the Avro Object a schema Id is requested from the Confluent Schema Registry. 
8. The schemaId which is a INTEGER is converted to Bytes and prepend to serialized AvroObject. 
9. During Deserialization : First 4 bytes are removed from the ByteArray. 4 bytes are converted back to INTEGER(SchemaId) 
10. Schema is requested from the Confluent Schema Registry and using this schema the byteArray is deserialized. 

http://bytepadding.com/big-data/spark/avro/avro-serialization-de-serialization-using-confluent-schema-registry/

Powiązane problemy