2013-03-11 2 views
11

У меня есть два вопроса:Avro эволюция схемы

  1. Можно ли использовать один и тот же читатель и анализировать записи, которые были написаны с двумя схемами, которые совместимы, например, Schema V2 имеет только дополнительное поле для сравнения по сравнению с Schema V1, и я хочу, чтобы читатель понял и то и другое? Я думаю, что ответ здесь нет, но если да, как мне это сделать?

  2. Я пытался писать записи с Schema V1 и читать его с Schema V2, но я получаю следующее сообщение об ошибке:

    org.apache.avro.AvroTypeException: Найдено Foo, ожидая Foo

Я использовал Авро-1.7.3 и:

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

Ниже приведены примеры двух схем (я пытался добавить пространство имен, а также, но не повезло).

схемы 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" 
      }] 
     } 
    } 
}] 
} 

Схема 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" 
          }] 
        } 
      }] 
}] 
} 

Заранее спасибо.

ответ

9

Я столкнулся с той же проблемой. Это может быть ошибкой avro, но вы, вероятно, можете обойтись, добавив «default»: null в поле «покупка».

Проверьте мой блог для деталей: http://ben-tech.blogspot.com/2013/05/avro-schema-evolution.html

+5

Значение по умолчанию является обязательным при использовании схемы эволюции. Если вы не указали значение по умолчанию для поля, которое присутствует в схеме считывателя, но не в схеме записи, Avro не может понять, как создать это новое поле в анализируемой структуре. – LiMuBei

0

Вы можете сделать противоположное ему. Вы можете проанализировать схему данных 1 и записать данные из схемы 2. Beacause во время записи записывает данные в файл, и если мы не предоставляем какое-либо поле во время чтения, это будет нормально. Но если мы пишем меньше поля, чем прочитано, оно не будет распознавать дополнительное поле во время чтения, поэтому оно даст ошибку.

0

Лучшим способом является отображение схемы для поддержки схемы, такой как реестр Confluent Avro.

Ключевого момента Aways:

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/

Смежные вопросы