Проверка данных в 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
соответствующие тесты, которые могли бы обеспечить полезную отправную точку.