我是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架构中指定包含正则表达式?
支持此类内容的任何其他数据序列化格式?
答案 0 :(得分:2)
您应该可以使用自定义logical type。然后,您可以直接在模式中包含正则表达式。
例如,以下是如何在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
您可以阅读有关实施和使用逻辑类型here的更多信息。
编辑:对于Java实现,我相信您将要查看以下类:
LogicalType
,您需要扩展的基础。Conversion
,用于执行数据的转换(或验证)。LogicalTypes
和Conversions
,现有实施的一些示例。TestGenericLogicalTypes
,相关的测试可以提供一个有用的起点。