NiFi JsonRecordSetWriter跳过嵌套字段

NiFi JsonRecordSetWriter跳过嵌套字段,json,apache-nifi,avro,Json,Apache Nifi,Avro,我正在将卡夫卡主题中的消息拉入NiFi,并且发现JsonRecordSetWriter没有输出嵌套字段的问题。如果我从该编写器切换到CSV编写器,我不会遇到相同的问题,但是Avro和XML编写器都有相同的问题,因此我认为这是推断模式的问题 以下是我的简化输入: { "data": [ { "object": { "extensions": {

我正在将卡夫卡主题中的消息拉入NiFi,并且发现JsonRecordSetWriter没有输出嵌套字段的问题。如果我从该编写器切换到CSV编写器,我不会遇到相同的问题,但是Avro和XML编写器都有相同的问题,因此我认为这是推断模式的问题

以下是我的简化输入:

{
    "data": [
        {
            "object": {
                "extensions": {
                    "field1": "TS",
                    "field2": "howdy"
                }
            }
        },
        {
            "object": {
                "extensions": {
                    "field1": "TT",
                    "field3": "something"
                }
            }
        }
    ]
}
以及输出:

[ {
  "data" : [ {
    "object" : {
      "extensions" : {
        "field1" : "TS",
        "field2" : "howdy"
      }
    }
  }, {
    "object" : {
      "extensions" : {
        "field1" : "TT",
        "field2" : null
      }
    }
  } ]
} ]
如果我使用CSV writer,第一条记录会得到字段1和2,第二条记录会得到字段1和3,因此JSONRecorderReader正确地从Kafka读取了数据,而JsonRecordSetWriter没有正确地写入数据。看起来模式推理引擎正在读取数组中的第一条记录作为其模式,然后根据该记录进行输出。字段2是输出,不管它在记录2中是否存在,而字段3则被忽略,因为它在记录1中不存在

知道得比我多的人有什么建议吗


提前感谢您的帮助

不幸的是,我解决了我的问题,但没有弄清楚为什么会这样。我解决这个问题的方法是从ConsumeKafkaRecord处理器切换到ConsumeKafka处理器,它不使用JSONterReader和JsonRecordSetWriter控制器来处理Json。因为我从Kafka中提取的值已经在Json中了,所以将它们作为字符串获取并从那里开始(添加application/Json mime.type以确保它们得到正确处理)对我来说效果很好

这个问题也可以通过创建一个包含所有可能字段的模式来解决,但这会导致大量空字段,因为记录的填充非常稀疏,而且我的一个字段以符号开头,NiFi在任何地方都使用Avro格式的模式,这使问题更加复杂,所以我必须解决这个问题(NiFi 1.7中的错误修复允许这样做,但也有局限性)


所以我在路上——不确定这段经历是否会帮助别人,但如果真的这样做,那太好了!p> 我在使用普通JSON的transformRecord时遇到了几乎相同的问题。简言之,流在应用程序事件s3中列出了一个条目,并将这些事件的jonson转换为两种类型:

1-雅典娜桌

2-用于HTTP调用

每个事件文件包含超过200个事件,并且在这些事件的中间包含了一个嵌套的“特征”,并且来自这些特征的信息从来没有出现过(这是一个事件很少出现在这个“集合”事件中,大约1到2%个事件在存档中,但是它们非常重要)。 我不得不修改我的流程的开始,使其工作

流程是:

ListS3->FetchS3Object->jolttransferormrecord->SplitJson->EvaluateJsonPath

并留下:

ListS3->FetchS3Object->ConvertRecord->SplitJson->JoltTransformMJSON->EvaluateJsonPath

现在它工作得很好。 @Chrick解决方案帮助我确定了错误是什么,由于我的问题有点不同,我希望这能帮助一些人