Проверка данных в AVRO

Я новичок в AVRO и прошу извинить меня, если это простой вопрос. У меня есть случай, когда я использую схему AVRO для записи звонков.

Допустим, у меня есть авро схема

{
    "name": "abc",
    "namepsace": "xyz",
    "type": "record",
    "fields": [
        {"name": "CustId", "type":"string"},
        {"name": "SessionId", "type":"string"},
     ]
}

Теперь, если вход как

{
    "CustId" : "abc1234"
    "sessionID" : "000-0000-00000"
}

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

Любые другие форматы сериализации данных, которые поддерживают что-то вроде этого?

1 ответ

Решение

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

Например, вот как вы могли бы реализовать один в JavaScript:

var avro = require('avsc'),
    util = require('util');

/**
 * Sample logical type that validates strings using a regular expression.
 *
 */
function ValidatedString(attrs, opts) {
  avro.types.LogicalType.call(this, attrs, opts);
  this._pattern = new RegExp(attrs.pattern);
}
util.inherits(ValidatedString, avro.types.LogicalType);

ValidatedString.prototype._fromValue = function (val) {
  if (!this._pattern.test(val)) {
    throw new Error('invalid string: ' + val);
  }
  return val;
};

ValidatedString.prototype._toValue = ValidatedString.prototype._fromValue;

И как бы вы использовали это:

var type = avro.parse({
  name: 'Example',
  type: 'record',
  fields: [
    {
      name: 'custId',
      type: 'string' // Normal (free-form) string.
    },
    {
      name: 'sessionId',
      type: {
        type: 'string',
        logicalType: 'validated-string',
        pattern: '^\\d{3}-\\d{4}-\\d{5}$' // Validation pattern.
      }
    },
  ]
}, {logicalTypes: {'validated-string': ValidatedString}});

type.isValid({custId: 'abc', sessionId: '123-1234-12345'}); // true
type.isValid({custId: 'abc', sessionId: 'foobar'}); // false

Вы можете прочитать больше о реализации и использовании логических типов здесь.

Изменить: Я думаю, что для реализации Java вы захотите взглянуть на следующие классы:

  • LogicalType, база вам нужно будет расширить.
  • Conversion, чтобы выполнить преобразование (или проверку в вашем случае) данных.
  • LogicalTypes а также Conversions Несколько примеров существующих реализаций.
  • TestGenericLogicalTypes соответствующие тесты, которые могли бы обеспечить полезную отправную точку.
Другие вопросы по тегам