Как получить проверку схемы Avro для поддержки псевдонимов полей? - PullRequest
1 голос
/ 12 апреля 2019

Я переименовал поле в записи, сериализованной в Avro.Я хочу поддержать чтение старых версий данных, без реестра схемы.Поэтому я сохраняю все версии схемы как ресурсы, загруженные из пути к классам.

Это прекрасно работает и поддерживает эволюцию схемы.Я могу читать данные, сериализованные со старыми схемами, когда они обратно совместимы.Как часть обеспечения этого я хочу проверить схемы, когда приложение запускается.К сожалению, проверка схемы не учитывает псевдонимы полей, даже если данные декодирования не выполняются.

Вот простой пример, подтверждающий мою точку зрения:

import java.util.Collections;

import org.apache.avro.Schema;
import org.apache.avro.SchemaBuilder;
import org.apache.avro.SchemaValidationException;
import org.apache.avro.SchemaValidatorBuilder;


public class Bar {
    public static void main(String[] args) throws SchemaValidationException {
        Schema stringType = SchemaBuilder.builder().stringType();
        Schema s1 = SchemaBuilder.builder().record("foo").fields()
                .name("test1").type(stringType).noDefault()
                .endRecord();
        Schema s2 = SchemaBuilder.builder().record("foo").fields()
                .name("test2").aliases("test1").type(stringType).noDefault()
                .endRecord();

        new SchemaValidatorBuilder().canReadStrategy().validateLatest().validate(s2, Collections.singleton(s1));

    }
}

Это вызывает следующее исключение:

Exception in thread "main" org.apache.avro.SchemaValidationException: Unable to read schema: 
{
  "type" : "record",
  "name" : "foo",
  "fields" : [ {
    "name" : "test1",
    "type" : "string"
  } ]
}
using schema:
{
  "type" : "record",
  "name" : "foo",
  "fields" : [ {
    "name" : "test2",
    "type" : "string",
    "aliases" : [ "test1" ]
  } ]
}
    at org.apache.avro.ValidateMutualRead.canRead(ValidateMutualRead.java:70)
    at org.apache.avro.ValidateCanRead.validate(ValidateCanRead.java:40)
    at org.apache.avro.ValidateLatest.validate(ValidateLatest.java:51)
    at Bar.main(Bar.java:18)

1 Ответ

1 голос
/ 15 апреля 2019

Извините, что отвечаю на мой вопрос:

Я обнаружил вариант этого вопроса, но не ответил в списке рассылки пользователей Arvo. Различное поведение между SchemaValidator и SchemaCompatibility в отношении псевдонима поля

Мне кажется, что в SchemaValidator есть ошибка, но я не понимаю, почему и SchemaValidator, и SchemaCompatibility, так что мне кажется, что я скучаю что-то.

Короче говоря, используйте SchemaCompatibility.checkReaderWriterCompatibility вместо SchemaValidatorBuilder, чтобы сделать его более полным и использовать логику декодирования.

...