使用 Avro 模式验证字段值长度

Field value length validation with an Avro schema

我正在使用 Apache NiFi 将 CSV 文件导入 MySQL 数据库。

要验证我感兴趣的输入,请使用 Avro schema

问题是我在规范中找不到任何关于字段值长度(最小值、最大值或范围)的信息,而且当我浏览时似乎没有人询问它。

我错过了什么或错了什么?

我刚刚快速浏览了文档,似乎如果您想要固定长度,则需要使用 fixed data type

由于您的输入是 CSV,您可以使用 ValidateCsv 处理器,它有自己的 DSL,比 Avro 允许更多的约束,例如 StrMinMaxLMinMax

答案是,Avro 中不存在您要求的内容。

我知道!我也很失望。但是 Apache 的人很清楚,“Avro 是一个数据序列化系统”。 https://cwiki.apache.org/confluence/display/AVRO/FAQ#FAQ-WhatisAvro?

Avro 是一个 Apache 项目,最好赶上他们 data-engineering 的方式...无论出于何种原因,所有旧的都是新的,CSV 是 无处不在。争论一直是静态(“技术”)验证是为了确保对象的反序列化满足重新创建对象所需的最低要求。因此需要数据类型和潜在的空化。

比这更像是动态(“业务”)验证领域,例如,字符串的长度是否小于或等于 16 个字符。我认为 Avro 发现自己——尤其是使用 NiFi 等工具——正处于寻找自己 integration/data-engineering 工具的十字路口。曾经是“业务”验证的绒毛,现在很好data-science。

@Josh 暗示很难“不”,fixed-length 在某种程度上提供了帮助,但它是为二进制设计的,所以 fixed-length 以字节为单位。如果您使用的是 unicode 字符串(例如 Python),那么您的结果应该是统一的。但是,如果使用 UTF-8 和一种编码字符串的语言,那么字节数可能并不总是跟踪字符长度。

本着 work-arounds 的精神,如果您倾向于首先导入 Pandas,Pandera 项目在复杂检查方面做得非常好,包括长度、最小值、最大值...实际上是各种统计数据。这对 NiFi 本身没有多大帮助。

我所做的是使用 Avro 的“raw-ness”将内容推送到 S3,然后使用一大堆 dataframe-enabled 工具(我自己喜欢 Prefect 和 Dask),将其拾取并让奇迹发生。完成后,Python 工具将其放回 S3,NiFi 将在其中继续其 Avro-centred 旅程。