【问题标题】:Writing AVRO fixed type from JSON in NIFI在 NIFI 中从 JSON 编写 AVRO 固定类型
【发布时间】:2019-10-15 09:19:41
【问题描述】:

我正在尝试将包含 JSON 的 NiFi 流文件转换为 AVRO 记录。

我的问题是我不知道如何处理 AVRO 中的固定类型,即如何指定正确的 JSON 以转换为固定类型?

目前我正在使用 ConvertJsonToAvro 处理器。 AVRO 输出模式:

{
  "type" : "record",
  "name" : "Message",
  "namespace" : "com.example",
  "fields" : [ {
    "name" : "MAC",
    "type" : {
      "type" : "fixed",
      "name" : "MY_FIXED_TYPE",
      "size" : 6
    }
  }]
}

我尝试的输入 JSON 格式是

{ "MAC": [ 0, 1, 2, 3, 4, 5] }

{ "MAC": "012345" }

{"MAC":"\u0000\u0001\u0002\u0003\u0004\u0005"}

{"MAC":{"MY_FIXED_TYPE": "\u0000\u0001\u0002\u0003\u0004\u0005"}}

不幸的是,它们都不适合我。 我还尝试了 ConvertRecord 处理器而不是 ConvertJsonToAvro 处理器。也没有运气。

有什么想法吗?

【问题讨论】:

    标签: json apache-nifi avro


    【解决方案1】:

    经过进一步调查,ConvertJsonToAvro 处理器似乎不能用于生成 Avro FIXEDBYTES 数据。这可能是 NiFi 以及处理器如何使用 Avro 的错误。

    如果我没记错的话:

    1. NiFi ConvertJsonToAvro 使用 KiteSDK 将 JSON 解释为 Avro 数据。这种 JSON 到 Avro 的转换与规范中的 Avro JSON 编码相同。
    2. 此处理器将传入的字符串读入jackson JsonNode
    3. FIXEDBYTES 类型需要对应一个 JsonNode 其中isBinary() is true
    4. 据我所知,使用 Jackson 从不解析 JSON 字符串会生成这样的 JSON 节点。

    我会就此提出NiFi JIRA 或有关 KiteSDK 的问题。

    【讨论】:

      【解决方案2】:

      注意:此答案不适用于 NiFi JSON 到 Avro 的转换。对于错误的假设,我深表歉意!我不确定已知错误答案的最佳做法。

      in the spec 给出了字节类型的“正确”Avro JSON 编码示例。我想你正在寻找:

      {"MAC":"\u0000\u0001\u0002\u0003\u0004\u0005"}
      

      或者(对于联合中的固定模式):

      {"MAC":{"MY_FIXED_TYPE": "\u0000\u0001\u0002\u0003\u0004\u0005"}}
      

      您可以使用给定的 Schema 正确解析此输入字符串。

      【讨论】:

      • 不幸的是,这不起作用。 ConvertJsonToAvro 处理器将名为“error”的属性添加到错误输出流中,该属性的值无法转换字段 MAC:无法转换为固定:“\u0000\u0001\u0002\u0003\u0004\u0005”
      • 我使用 Avro JSONDecoder 进行了测试,因此在使用 NiFi 时可能会有一些细微的差异...您的 MAC 字段是否可以为空或是否存在联合?
      • 我在 ConvertJsonToAvro 处理器中使用的架构与我上面的问题中所述的架构相同。
      • 我也尝试过您的替代方法,但这会出现以下错误:“无法转换字段 MAC:无法转换为固定:{“MY_FIXED_TYPE”:“\u0000\u0001\u0002\u0003\u0004 \u0005"}"
      • 您最好将 ConvertRecord 与 JsonTreeReader 和 AvroRecordSetWriter 一起使用,基于记录的处理器通常比 ConvertJsonToAvro 更擅长转换
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-19
      • 2017-07-18
      相关资源
      最近更新 更多