【发布时间】:2020-02-23 04:02:22
【问题描述】:
我正在使用 Apache NiFi 将 CSV 文件导入 MySQL 数据库。
使用Avro schema 验证我感兴趣的输入。
问题是我在规范中找不到任何关于字段值长度(最小值、最大值或范围)的信息,而且当我浏览时似乎没有人询问它。
对此我有什么遗漏或错误?
【问题讨论】:
标签: database validation apache-nifi avro
我正在使用 Apache NiFi 将 CSV 文件导入 MySQL 数据库。
使用Avro schema 验证我感兴趣的输入。
问题是我在规范中找不到任何关于字段值长度(最小值、最大值或范围)的信息,而且当我浏览时似乎没有人询问它。
对此我有什么遗漏或错误?
【问题讨论】:
标签: database validation apache-nifi avro
答案是,您要求的内容在 Avro 中不存在。
我知道!我也很失望。但是 Apache 的人很清楚,“Avro 是一个数据序列化系统”。 https://cwiki.apache.org/confluence/display/AVRO/FAQ#FAQ-WhatisAvro?
Avro 是一个 Apache 项目,让它们赶上数据工程的方式会很好......无论出于何种原因,旧的东西都会再次焕然一新,而 CSV 无处不在。争论一直是静态(“技术”)验证是为了确保对象的反序列化满足重新创建对象所需的最低要求。所以需要数据类型和潜在的空值。
除此之外,动态(“业务”)验证领域的任何东西,例如,字符串的长度小于或等于 16 个字符。我认为 Avro 发现自己的地方——尤其是使用 NiFi 等工具——正处于发现自己是集成/数据工程工具的十字路口。曾经是“业务”验证的绒毛,现在只是好的数据科学。
@Josh 暗示了硬“不”,固定长度在某种程度上有所帮助,但它是为二进制设计的,所以固定长度以字节为单位。如果您使用的是 unicode 字符串(例如 Python),那么您的结果应该是统一的。但如果使用 UTF-8 和一种这样编码字符串的语言,那么字节数可能并不总是跟踪字符长度。
本着变通方法的精神,如果您倾向于首先导入 Pandas,Pandera 项目可以很好地完成复杂的检查,包括长度、最小值、最大值……实际上是各种统计数据。这对 NiFi 本身没有多大帮助。
我所做的是使用 Avro 的“原始性”将事物推送到 S3,然后使用一大堆支持数据帧的工具(我自己喜欢 Prefect 和 Dask),拿起它并让奇迹发生。完成后,Python 工具将其放回 S3,在那里 NiFi 继续其以 Avro 为中心的旅程。
【讨论】:
我刚刚快速浏览了文档,似乎如果你想要一个固定长度,你需要使用fixed data type
【讨论】:
由于您的输入是 CSV,您可以使用 ValidateCsv 处理器,它有自己的 DSL,允许比 Avro 更多的约束,例如 StrMinMax 和 LMinMax。
【讨论】: