2013-03-11 31 views
11

iki soru var:Avro şema evrimi

  1. mümkün Aynı okuyucuyu kullanmak ve uyumlu, örneğin iki şemalar ile yazılmıştır kayıtları ayrıştırmak için misadece Schema V1 ile karşılaştırıldığında ek bir isteğe bağlı alana sahip ve ben okuyucu hem anlamak isterim? Bence cevap burada hayır, ama eğer evet ise, bunu nasıl yaparım?

  2. Ben Schema V1 ile rekor yazma ve Schema V2 ile okumaya çalıştılar, ancak aşağıdaki hatayı alıyorum:

    org.apache.avro.AvroTypeException: bekliyor, foo Bulunan foo

Ben avro-1.7.3 ve kullanılmış:

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

İşte (Ben de bir ad alanını ekleyerek denedim ama hiç şansım) iki şemalar örnekleridir.

Şema 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" 
      }] 
     } 
    } 
}] 
} 

Şema V2: önceden

{ 
"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" 
          }] 
        } 
      }] 
}] 
} 

teşekkürler.

cevap

9

Aynı sorunla karşılaştım. Bu bir avro hatası olabilir, ancak muhtemelen "satın alma" alanına null "varsayılan" ekleyerek çalışabilirsiniz: null.

detaylar için blogumu kontrol edin: http://ben-tech.blogspot.com/2013/05/avro-schema-evolution.html

+5

Varsayılan değerler şarttır. Okuyucu şemasında bulunan, ancak yazar şemasında bulunmayan bir alan için varsayılan bir değer sağlamazsanız, Avro bu yeni alanı ayrıştırılmış yapıda nasıl oluşturacağınızı anlayamaz. – LiMuBei

0

Siz bunun tersini yapabilirsiniz. Veri şemasını 1 ayrıştırabilir ve şema 2'den veri yazabilirsiniz. Yazma zamanında Beacause, dosyaya veri yazar ve eğer okuma zamanında herhangi bir alan sağlamazsa, o zaman iyi olur. Fakat okumadan daha az alan yazarsak, okuma zamanında fazla alan tanımadığı için hata verecektir.

0

En iyi yol, Confluent Avro schema kayıt defteri gibi şemayı korumak için bir şema eşlemesine sahip olmaktır.

Anahtar almak sonuçlar: şema evrimi kullanırken

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/