在 NIFI 中从 JSON 写入 AVRO 固定类型

Writing AVRO fixed type from JSON in NIFI

我正在尝试将包含 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"}}

不幸的是,none 对我有用。 我还尝试了 ConvertRecord 处理器而不是 ConvertJsonToAvro 处理器。也没有运气。

有什么想法吗?

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

给出了字节类型 "correct" Avro JSON 编码的示例 in the spec。我认为您正在寻找:

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

或者(对于联合中的固定架构):

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

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

经过进一步调查,似乎 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 never 解析 JSON 字符串会生成这样一个 JSON 节点。

我会提出 NiFi JIRA 关于这个问题,或者 KiteSDK 上的问题。