apache-nifi - Nifi MergeRecord 处理器合并空值
问题描述
我正在拆分字段列表并尝试在最后合并它们。我有 2 种字段,标准字段和自定义字段。我处理自定义字段的方式与标准字段不同。
{
"standardfield1" : "fieldValue1",
"customField1" : "customValue"
}
这些必须翻译成
{
"standardfield1" : "fieldValue1",
"customFields" : [
{ "type" : "customfield",
"id" : 1212 //this is id of the customField1, retrieved at run time
"value" : "customValue"
} ]
}
我的 mergeRecord 架构设置为
{
"name": "custom field",
"namespace": "nifi",
"type": "record",
"fields": [
{ "name": "id", "type": "string" },
{ "name": "type", "type": "string" },
{ "name": "value", "type": "string" }
]
}
根据我的需要,我将标准字段的内容设置为新的流文件属性,因为我可以从中提取它,并将空值放入流文件内容中。
因此,自定义字段和标准字段都连接到 mergeRecord 处理器。
只要有效负载中提供自定义字段,它就可以很好地工作。如果只有标准字段而没有自定义字段,则 mergeRecord 处理器不会合并任何东西,也不会失败,它只会抛出 NullPointerException 并且流文件会永远卡在队列中。
我想让 mergeRecord 处理器甚至可以合并空的内容流文件。
任何帮助,将不胜感激
解决方案
我不确定我是否完全理解您的用例,但是对于您上面的输入,如果您已将 customField1 的 ID 提取/填充到一个属性中(我们称之为 myId),那么您可以使用JoltTransformJSON来获得您想要的上面的输出,使用此链规范:
[
{
"operation": "shift",
"spec": {
"standardfield1": "standardfield1",
"customField*": {
"@": "customFields.[&(1,1)].value",
"#customfield": "customFields.[&(1,1)].type",
"#${myId}": "customFields.[&(1,1)].id"
}
}
},
{
"operation": "remove",
"spec": {
"customFields": {
"0": ""
}
}
},
{
"operation": "modify-overwrite-beta",
"spec": {
"customFields": {
"*": {
"id": "=toInteger"
}
}
}
}
]
如果存在 customField,这将创建 customFields 数组,并使用上面的值(包括 myId 属性的值)填充它。如果你愿意,你可以调整一些东西(比如在上面的链中添加一个默认规范)来为 customFields 添加一个空数组(例如,保持架构快乐)。如果我误解了您要执行的操作,请告诉我,我会尽力提供帮助。
推荐阅读
- r - 如何在ggplot2中制作单个堆叠条形图
- java - 如何为输入地址制作好的editText?
- macos - 尽管做了 chmod 777,但权限被拒绝
- python - 使用 Python 从 Data.gov.sg API (json) 下载实时降雨数据
- python - 如果键值的值是单独列表的成员,则无法有效地从字典中提取键
- css - CSS 溢出自动及其工作
- django - 序列化 Django 模型时如何包含父对象?
- visual-studio-code - Ctrl+Shift+E 将特殊字符插入文件而不是在 VS Code 中显示资源管理器窗格
- javascript - Angular RxJS - 将 valueChanges 管道值设置为 null 直到可观察到解决
- django - NoReverseMatch 发生在任何异常中