我的传入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需要先发生?
编辑:收到回复后添加了有关数据库的更多详细信息。
答案 0 :(得分:2)
您的目标数据库是什么?您的目标表是什么样的?除非您的数据库,驱动程序和目标表支持嵌套记录,否则PutDatabaseRecord可能无法处理嵌套记录。
或者,您可能需要使用UpdateRecord来压缩"雇主"对象到记录顶层的字段中。这是一个手动过程(直到NIFI-4398实施),但您只有4个字段。展平记录后,您可以使用PartitionRecord获取具有特定值的所有记录,例如所有employees.company。来自PartitionRecord的传出流文件在技术上将构成分区字段的不同值。我不确定你对不同的价值观做了什么,但如果你能详细说明,我很乐意提供帮助。