在 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 FIXED
或BYTES
数据。这可能是 NiFi 的错误以及处理器如何使用 Avro。
如果我没记错的话:
- NiFi ConvertJsonToAvro 使用 KiteSDK 将 JSON 解释为 Avro 数据。这种 JSON 到 Avro 的转换 与规范中的 Avro JSON 编码不同。
- 此处理器将传入的字符串读入 jackson JsonNode。
FIXED
和 BYTES
类型需要对应一个 JsonNode,其中 isBinary()
is true.
- 据我所知,用 Jackson never 解析 JSON 字符串会生成这样一个 JSON 节点。
我会提出 NiFi JIRA 关于这个问题,或者 KiteSDK 上的问题。
我正在尝试将包含 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 FIXED
或BYTES
数据。这可能是 NiFi 的错误以及处理器如何使用 Avro。
如果我没记错的话:
- NiFi ConvertJsonToAvro 使用 KiteSDK 将 JSON 解释为 Avro 数据。这种 JSON 到 Avro 的转换 与规范中的 Avro JSON 编码不同。
- 此处理器将传入的字符串读入 jackson JsonNode。
FIXED
和BYTES
类型需要对应一个 JsonNode,其中isBinary()
is true.- 据我所知,用 Jackson never 解析 JSON 字符串会生成这样一个 JSON 节点。
我会提出 NiFi JIRA 关于这个问题,或者 KiteSDK 上的问题。