【问题标题】:Field value length validation with an Avro schema使用 Avro 模式验证字段值长度
【发布时间】:2020-02-23 04:02:22
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: database validation apache-nifi avro


    【解决方案1】:

    答案是,您要求的内容在 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 为中心的旅程。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 感谢您的回答,但是如果我想检查最大值或范围,因为可以在 MySQL 数据库中声明一个字段,该怎么办?
      • 抱歉,不确定。您可能无法做到这一点?
      • 如果有一个统一的架构可以一步验证所有内容,那会很酷。
      【解决方案3】:

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

      【讨论】:

      • Avro 没有字段声明的长度属性是设计使然吗?
      • 我相信是这样,我不知道 Avro 中的任何字段验证功能,数据类型的东西更多的是关于如何格式化传入字节而不是字段验证。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-03
      • 2010-11-30
      相关资源
      最近更新 更多