【问题标题】:NiFi non-Avro JSON Reader/WriterNiFi 非 Avro JSON 读取器/写入器
【发布时间】:2018-11-14 09:05:10
【问题描述】:

标准的 Apache NiFi 读取器/写入器似乎只能基于 Avro 模式解析 JSON 输入。

Avro 模式对 JSON 有限制,例如它不允许以数字开头的有效 JSON 属性。

JoltTransformJSON 处理器在这里可以提供帮助(它不会对输入 JSON 的外观施加 Avro 限制),但该处理器似乎不支持批处理 FlowFiles。它也不是基于读者和作者(可能是因为这个)。

有没有办法读取任意有效的批处理 JSON 输入,例如多行形式

{"myprop":"myval","12345":"12345",...}
{"myprop":"myval2","12345":"67890",...}

并将其转换为其他 JSON 结构,例如由JSON schema 定义,例如使用JSON Patch 转换,无需编写自己的处理器?

更新

我正在使用 Apache NiFi 1.7.1

更新 2

不幸的是,@Shu 的建议确实奏效了。我得到同样的错误。 将案例简化为单个 UpdateRecord 处理器,该处理器读取具有数字属性的 JSON,并使用

写入不具有此类属性的 JSON
myprop : /data/5836c846e4b0f28d05b40202

映射。还是一样的错误:(

【问题讨论】:

    标签: json avro apache-nifi


    【解决方案1】:

    它不允许有效的以数字开头的 JSON 属性?

    这个错误NiFi-4612 在 NiFi-1.5 版本中修复,我们可以使用 AvroSchemaRegistry 来定义你的架构并更改

    验证字段名称

    false
    

    然后我们可以有以数字开头的 avro 模式字段名称。

    更多详情请参考this链接。

    有没有办法读取任意有效的批量 JSON 输入,例如多行形式?

    此错误NiFi-4456 在 NiFi-1.7 中修复,如果您不使用此版本的 NiFi,那么我们可以通过使用解决方法来创建带有 ,(逗号分隔符)的 json 消息数组。

    流程:

    1.SplitText //split the flowfile with 1 line count
    2.MergeRecord //merge the flowfiles into one
    3.ConvertRecord
    

    有关此特定问题的更多详细信息,请参阅this 链接(我已经解释了流程)。

    【讨论】:

    • 谢谢,这很有趣。我正在使用 NiFi 1.7.1。那么你的意思是我必须使用 AvroSchemaRegistry 来解决属性名称中的数字问题吗?我之前没有使用注册表(将架构直接放入处理器/控制器字段。解决了数字 JSON 属性的问题后,我可以使用 UpdateRecord(支持批处理)而不是 JoltTransformJSON 处理器。
    • 我的意思是,没有 AvroSchemaRegistry 就不可能改变行为,例如通过将“验证字段名称”设置为 false?因为只要我的 Avro 架构中的属性名称以 NiFi 1.7.1 中的数字开头,我就可以使字符异常无效。
    • @SergeyShcherbakov,我认为如果不使用 AvroSchemaRegistry 我们不能validate field names,而且我认为使用 UpdateRecord 处理器来更改文件名会是跳过 AvroSchemaRegistry 的好方法。
    • 谢谢!会试一试
    • 请查看问题中的更新。不幸的是,使用 AvroSchemaRegistry 并没有帮助:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多