首页 > 解决方案 > 使用 Avro 模式验证字段值长度

问题描述

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

为了验证我对使用Avro schema感兴趣的输入。

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

我对此有什么遗漏或错误?

标签: databasevalidationapache-nifiavro

解决方案


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

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

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

除此以外的任何东西都似乎是动态(“业务”)验证的领域,例如,字符串的长度小于或等于 16 个字符。我认为 Avro 发现自己的地方——尤其是使用 NiFi 等工具——正处于发现自己是集成/数据工程工具的十字路口。过去是“业务”验证的绒毛,现在只是好的数据科学。

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

In the spirit of work-arounds, if you're inclined to import first into Pandas, the Pandera project does a pretty good job of complex checks including lengths, min, max... actually all manner of statistics. This won't help much with NiFi natively.

What I do is use the "raw-ness" of Avro to push things to S3, and then a boatload of dataframe-enabled tools (I like Prefect and Dask myself), pick it up and make magic happen. Once done, the Python tools put it back to S3, where NiFi continues in its Avro-centred journey.


推荐阅读