Json NiFi中产生震动变换的数组

Json NiFi中产生震动变换的数组,json,apache-nifi,jolt,Json,Apache Nifi,Jolt,我以前从未使用过颠簸变换,我不知道如何修复我所做的,所以如果这是一个非常简单的修复,我很抱歉 下面我有两个XML文件虚拟版本,实际包含我在NiFi中使用MergeRecord合并在一起的PII。由于输出是一个带有JSON数组的流文件,因此建议使用JoltTransform将它们正确地合并在一起。有人向我提出了一个问题,即如何在NiFi中基本上实现流式连接,这正是我所需要的 虽然这在很大程度上有效,但我仍然有一个问题。我的基本级别父亲ID、父亲姓名、生日等上的所有标记都转换为数组。我需要这些不是数

我以前从未使用过颠簸变换,我不知道如何修复我所做的,所以如果这是一个非常简单的修复,我很抱歉

下面我有两个XML文件虚拟版本,实际包含我在NiFi中使用MergeRecord合并在一起的PII。由于输出是一个带有JSON数组的流文件,因此建议使用JoltTransform将它们正确地合并在一起。有人向我提出了一个问题,即如何在NiFi中基本上实现流式连接,这正是我所需要的

虽然这在很大程度上有效,但我仍然有一个问题。我的基本级别父亲ID、父亲姓名、生日等上的所有标记都转换为数组。我需要这些不是数组,因为我想使用我在MergeRecord中使用的相同的组合模式,该模式没有作为数组的字段

规范中有什么我需要更改的吗,或者我需要做另一个JoltTransform吗

输入XML 1

模式

颠簸移位操作

实际产量

预期产量


MergeContent和MergeRecord通常用于合并模式相同的两个或多个流文件,例如将单个JSON对象绑定到更大的数组中

您可以使用XMLFileLookupService使用LookupRecord,该服务将获取第二个XML文件的内容,并将其插入到您选择的位置处的第一个流文件的记录中。我不确定的部分是如何查找DOCID以匹配父id,然后返回顶级DOC元素中的每个字段

如果不起作用,您可以尝试使用ExecuteScript、InvokeScriptedProcessor或ScriptedLookupService手动执行合并


编辑附加信息:如果JOLT规范总是将非null值放在第一位,或者数组中的所有元素都将为null或相同,您可以向链中添加一个规范,用数组中的第一个元素替换字段值。

我使用了JoltTransform,因为我意识到模式告诉NiFi希望两个文件中都存在所有字段,然后成功地将它们合并为一个,而现在只有一个问题:字段是数组。正如你所说,我对LookupRecord的关注是如何查找文档和父文档。我们的客户确实希望我们避免使用脚本,但如果我无法找到使用jolt的方法,这可能是我唯一的选择。我真的很喜欢保留MergeRecord的想法,因为它只合并了具有匹配id属性的文件。我更新了我的答案,尝试使用其他规范。谢谢。它总是将非空值放在第一位;你知道那个规格可能是什么样子吗?我试着四处看看,但我很难理解Jolt转换的语言。我大量使用在线Jolt应用程序及其示例,这里有一个链接,指向使用=firstElement的列表示例:因此,为了澄清,我需要硬编码所有需要从数组更改为单字段值的字段?非常感谢你的帮助。
<?xml version="1.0" encoding="UTF-8"?>
<FoundingFathers>
   <FatherID>1234</FatherID>
   <FatherName>George Washington</FatherName>
   <ResidentialInformation>
      <Name>Mount Vernon</Name>
      <StreetAddress>3200 Mount Vernon Hwy</StreetAddress>
       <City>Mt Vernon</City>
       <State>VA</State>
       <ZipCode>22121</ZipCode>
   </ResidentialInformation>
    <BirthDate>1732-02-22</BirthDate>
</FoundingFathers>
<?xml version="1.0" encoding="UTF-8"?>
<DOC>
   <DOCID>1234</DOCID>
   <FATHERNAME>George Washington</FATHERNAME>
   <RAW_TXT>George Washington lived in Mount Vernon in Mt Vernon, VA. The Washington family had owned land in the area since 1674. The original house was built in 1734 by Washington's father.</RAW_TXT>
   <TXT>
      <S>
         <FATHERNAME>George Washington</FATHERNAME>
         <ESTATENAME>Mount Vernon</>
         <ESTATEPLACE>VA</ESTATEPLACE>
      </S>
      <S>
         <OWNER>Washington family</OWNER>
         <YEAROWNED>1674</YEAROWNED>
      </S>
      <S>
         <BUILTIN>1734</BUILTIN>
         <BUILTBY>Washington's father</BUILTBY>
      </S>
   </TXT>
</DOC>
Record Reader: XMLReader
Record Writer: JsonRecordSetWriter
Merge Strategy: Bin-Packing Algorithm
Correlation Attribute Name: FatherID
Attribute Strategy: Keep All Unique Attributes
Minimum Number of Records: 2
Maximum Number of Records: 2
Minimum Bin Size: 0 B
Maximum Bin Size: No value set
Max Bin Age: No value set
Maximum Number of Bins: 10
{
  "namespace": "ff",
  "name": "founders",
  "type": "record",
  "fields": [
    {"name":"FatherID", "type": ["string", "null"], "default": null},
    {"name":"FatherName", "type": ["string", "null"], "default": null},
    {"name":"ResidentialInformation", "type": ["null", {
      "name": "ResidentialInformation", "type": "array", "items": {
        "name": "ResidentialInformation", "type": "record", "fields": [
          {"name": "Name", "type": ["string","null"], "default":null},
          {"name": "StreetAddress", "type": ["string","null"], "default":null},
          {"name": "City", "type": ["string","null"], "default":null},
          {"name": "State", "type": ["string","null"], "default":null},
          {"name": "ZipCode", "type": ["string","null"], "default":null}
        ]
      }
    }]},
    {"name":"BirthDate", "type": ["string", "null"], "default": null},
    {"name": "DOCID", "type": ["string", "null"], "default": null},
    {"name": "FINAME", "type": ["string", "null"], "default": null},
    {"name": "CUSTNAME", "type": {"type": "array", "items": "string"}},
    {"name": "RAW_TXT", "type": {"type": "array", "items": "string"}},
    {"name": "TXT", "type": {
      "name": "TXT", "type": "record", "namespace": "txt.sar", "fields": [
        {"name": "S", "type": {
          "type": "array", "items": {
            "name": "RecordInArray", "type": "record", "fields": [
              {"name": "FATHERNAME", "type": {"type": "array", "items": ["string","null"]}},
              {"name": "ESTATENAME", "type": {"type": "array", "items": ["string","null"]}},
              {"name": "ESTATEPLACE", "type": {"type": "array", "items": ["string","null"]}},
              {"name": "OWNER", "type": {"type": "array", "items": ["string","null"]}},
              {"name": "YEAROWNED", "type": {"type": "array", "items": ["string","null"]}},
              {"name": "BUILTIN", "type": {"type": "array", "items": ["string","null"]}},
              {"name": "BUILTBY", "type": {"type": "array", "items": ["string","null"]}}
            ]
          }
        }}
      ]
    }}
  ]}

{
    "*": {
      "*": "&"
    }
}
[ {
  "FatherID" : ["1234", null],
  "FatherName" : ["George Washington", null],
  "ResidentialInformation" : [ {
    "Name" : "Mount Vernon",
    "StreetAddress" : "3200 Mount Vernon Hwy",
    "City" : "Mt Vernon",
    "State" : "VA",
    "ZipCode" : "22121"
  } ],
  "BirthDate" : ["1732-02-22", null],
  "DOCID" : "1234",
  "FATHERNAME" : "George Washington",
  "RAW_TXT" : [ "\nGeorge Washington lived in Mount Vernon in Mt Vernon, VA. The Washington family had owned land in the area since 1674. The original house was built in 1734 by Washington's father.\n" ],
  "TXT" : {
    "S" : [ {
      "FATHERNAME" : [ "George Washington" ],
      "ESTATENAME" : [ "Mount Vernon" ],
      "ESTATEPLACE" : [ "VA" ]
    }, {
      "OWNER" : [ "Washington family" ],
      "YEAROWNED" : [ "1674" ]
    }, {
      "BUILTIN" : [ "1734" ],
      "BUILTBY" : [ "Washington's father" ]
    } ]
  }
} ]
[ {
  "FatherID" : "1234",
  "FatherName" : "George Washington",
  "ResidentialInformation" : [ {
    "Name" : "Mount Vernon",
    "StreetAddress" : "3200 Mount Vernon Hwy",
    "City" : "Mt Vernon",
    "State" : "VA",
    "ZipCode" : "22121"
  } ],
  "BirthDate" : "1732-02-22",
  "DOCID" : "1234",
  "FATHERNAME" : "George Washington",
  "RAW_TXT" : [ "\nGeorge Washington lived in Mount Vernon in Mt Vernon, VA. The Washington family had owned land in the area since 1674. The original house was built in 1734 by Washington's father.\n" ],
  "TXT" : {
    "S" : [ {
      "FATHERNAME" : [ "George Washington" ],
      "ESTATENAME" : [ "Mount Vernon" ],
      "ESTATEPLACE" : [ "VA" ]
    }, {
      "OWNER" : [ "Washington family" ],
      "YEAROWNED" : [ "1674" ]
    }, {
      "BUILTIN" : [ "1734" ],
      "BUILTBY" : [ "Washington's father" ]
    } ]
  }
} ]