我有一个SQL数据库,我提取了一些行,然后将它们转换成Json以提供MongoDB。我坚持转换步骤。我已经尝试过以下流程: 该进程在MergeRecord处理器上停滞了,我不知道为什么。
目标是转换这种(简化的)SQL查询结果:
ID ROUTE_CODE STATUS SITE_ID SITE_CODE
379619 1801300001 10 220429 100001
379619 1801300001 10 219414 014037
379619 1801300001 10 220429 100001
379620 1801300002 10 220429 100001
379620 1801300002 10 219454 014075
379620 1801300002 10 220429 100001
到此json:
[
{
"routeId": "379619",
"routeCode": "1901300001",
"routeStatus": "10",
sites: [
{ "siteId": "220429", "siteCode" : "100001" },
{ "siteId": "219414", "siteCode" : "014037" }
]
},
{
"routeId": "379620",
"routeCode": "1901300002",
"routeStatus": "10",
sites: [
{ "siteId": "220429", "siteCode" : "100001" },
{ "siteId": "219454", "siteCode" : "014075" }
]
}
]
MergeRecord应该按“ routeId”分组,我也不知道将站点分组为数组的正确Jolt变换...
答案 0 :(得分:2)
由于卡死在ConvertAvrToJson和MergeRecord之间的队列上而导致流阻塞,红色指示符可以看到该队列已达到最大10k流文件大小。这意味着在降低队列的阈值之前,ConvertAvroToJson处理器将不再执行,除非MergeRecord可能正在等待更多文件,所以队列不会减少。
您可以更改队列上的设置以将阈值增加到高于等待的记录数,或者可以以不同的方式实现流程...
在ExecuteSql之后,似乎使用了3个处理器来进行基本拆分,转换为json并重新合并在一起。通过不拆分,而仅将ConvertRecord与Avro读取器和JSON写入器一起使用,可以更有效地完成此操作,这样您就可以执行ExecuteSQL-> ConvertRecord-> JOLT。
此外,您可能希望将JoltTransformRecord视为JoltTransformJson的替代方法。
答案 1 :(得分:1)
执行ExecuteSQL(或ExecuteSQLRecord)之后,可以使用PartitionRecord并添加以下用户定义的属性(属性名称位于=
的左侧,值的右侧):
routeId = /ROUTE_ID
routeCode = /ROUTE_CODE
routeStatus = /STATUS
PartitionRecord应该使用JSON编写器,然后可以将JoltTransformJson用于以下规范:
[
{
"operation": "shift",
"spec": {
"*": {
"ID": "routeId",
"ROUTE_CODE": "routeCode",
"STATUS": "routeStatus",
"SITE_ID": "sites[#2].siteId",
"SITE_CODE": "sites[#2].siteCode"
}
}
},
{
"operation": "modify-overwrite-beta",
"spec": {
"routeId": "=firstElement(@(1,routeId))",
"routeCode": "=firstElement(@(1,routeCode))",
"routeStatus": "=firstElement(@(1,routeStatus))"
}
}
]
这会将每个站点ID /代码分组到sites
字段中。然后,您只需要MergeRecord即可将它们修补在一起。不幸的是,PartitionRecord尚不支持fragment.*
属性(我已经写了NIFI-6139来涵盖这一改进),因此MergeRecord无法保证原始输入文件中所有已转换的记录都可以在同一个合并流文件中。但是,每个合并的流文件将包含带有sites
数组的记录,其中包含一些特定的routeId/routeCode/routeStatus
值。