如何在NiFi中正确解析嵌套的Avro记录?

时间:2018-05-21 17:14:40

标签: avro apache-nifi

我的传入Avro记录大致遵循以下格式。我能够读取它们并将它们转换为现有的NiFi流程。但是,最近的更改要求我从这些文件中读取并解析此示例中的嵌套记录employers。我阅读了Apache NiFi博客文章Record-Oriented Data with NiFi ,但无法弄清楚如何让AvroRecordReader解析嵌套记录。

{
  "name": "recordFormatName",
  "namespace": "nifi.examples",
  "type": "record",
  "fields": [
    { "name": "id", "type": "int" },
    { "name": "firstName", "type": "string" },
    { "name": "lastName", "type": "string" },
    { "name": "email", "type": "string" },
    { "name": "gender", "type": "string" },
    { "name": "employers",
        "type": "record",
        "fields": [
            {"name": "company", "type": "string"},
            {"name": "guid", "type": "string"},
            {"name": "streetaddress", "type": "string"},
            {"name": "city", "type": "string"}
        ]}
  ]
}

我希望实现的是读取每个employers记录的recordFormatName记录的流程,并使用PutDatabaseRecord处理器来跟踪所见的employers值。目前的计划是将记录插入MySQL数据库。如下面的答案所示,我计划使用PartitionRecord根据employers子记录中的值对记录进行排序。我不需要此特定流程的顶级详细信息。

我尝试使用AvroRecordReader进行解析,但无法弄清楚如何指定嵌套记录。这可以单独用AvroRecordReader完成,还是预处理,比如JOLT Transform需要先发生?

编辑:收到回复后添加了有关数据库的更多详细信息。

1 个答案:

答案 0 :(得分:2)

您的目标数据库是什么?您的目标表是什么样的?除非您的数据库,驱动程序和目标表支持嵌套记录,否则PutDatabaseRecord可能无法处理嵌套记录。

或者,您可能需要使用UpdateRecord来压缩"雇主"对象到记录顶层的字段中。这是一个手动过程(直到NIFI-4398实施),但您只有4个字段。展平记录后,您可以使用PartitionRecord获取具有特定值的所有记录,例如所有employees.company。来自PartitionRecord的传出流文件在技术上将构成分区字段的不同值。我不确定你对不同的价值观做了什么,但如果你能详细说明,我很乐意提供帮助。