Carl Gieringer created NIFI-5664:
------------------------------------
Summary: LookupRecord cannot handle JSON array properties from
MongoDBLookupService
Key: NIFI-5664
URL: https://issues.apache.org/jira/browse/NIFI-5664
Project: Apache NiFi
Issue Type: Bug
Components: Core Framework
Affects Versions: 1.7.1, 1.8.0
Reporter: Carl Gieringer
We are using a LookupRecord processor to add an array property to a Record.
The LookupRecord's `Lookup Service` is a MongoDBLookupService. The idea is for
the LookupRecord to query Mongo documents by the Record's `_id`, to extract the
array property at `f` on that document, and to insert that array into the
Record at the RecordPath `f`. This flow results in the conversion error copied
below, which completely prevents the FlowFile from proceeding (routes to
Failure/Unmatched.) It appears that the `MongoDBLookupService` (or perhaps its
`MongoDBControllerService`) stores Mongo document arrays as `ArrayList`s, which
`DataTypeUtils#toArray` does not support. A simple fix appears to be to add a
few lines to `DataTypeUtils#toArray` to support `ArrayList`s. I will provide a
PR for this issue.
This issue appears in 1.7.1, and is extant in 1.8.0-SNAPSHOT (2018-10-02
b4c8e0179). I am not aware of any workaround to enrich a Record with an array
from Mongo.
LookupRecord Configuration
||Property||Value||
|Result RecordPath|/f|
|Record Result Contents|Insert Entire Record|
|_id|/_id|
MongoDBLookupService Configuration
||Property||Value||
|Lookup Value Field|f|
Conversion error (with irrelevant Mongo document and schema properties elided):
{code:java}
2018-10-04 15:00:31,348 ERROR [Timer-Driven Process Thread-1]
o.a.n.processors.standard.LookupRecord
LookupRecord[id=339bf72c-91c3-36f0-ac14-bc8b734e2582] Failed to write
MapRecord[{... f=[Document{{fid=5762addaffa7cf0980267acb, l=1.0}},
Document{{fid=5762adf32fc74d0418104201, l=2.12}},
Document{{fid=5762addd18b8b607802fec6f, l=3.32}},
Document{{fid=587542dd638e870838a79d08, l=1.0}},
Document{{fid=5762addbffa7cf0980267acd, l=3.32}}],
i=[Ljava.lang.Object;@35dee8fc, ...] with schema {
"namespace": "nifi",
"name": "MongoPosting",
"type": "record",
"fields": [
...
{ "name": "f", "type": [
"null",
{ "type": "array", "items": {
"type": "record", "name": "PostingFeatureDetails", "fields": [
{ "name": "fid", "type": "string" },
{ "name": "l" , "type": ["null", "double"] }
]}
}
]},
...
]
} as a JSON Object due to
org.apache.nifi.serialization.record.util.IllegalTypeConversionException:
Cannot convert value [[Document{{fid=5762addaffa7cf0980267acb, l=1.0}},
Document{{fid=5762adf32fc74d0418104201, l=2.12}},
Document{{fid=5762addd18b8b607802fec6f, l=3.32}},
Document{{fid=587542dd638e870838a79d08, l=1.0}},
Document{{fid=5762addbffa7cf0980267acd, l=3.32}}]] of type class
java.util.ArrayList to Object Array for field f:
org.apache.nifi.serialization.record.util.IllegalTypeConversionException:
Cannot convert value [[Document{{fid=5762addaffa7cf0980267acb, l=1.0}},
Document{{fid=5762adf32fc74d0418104201, l=2.12}},
Document{{fid=5762addd18b8b607802fec6f, l=3.32}},
Document{{fid=587542dd638e870838a79d08, l=1.0}},
Document{{fid=5762addbffa7cf0980267acd, l=3.32}}]] of type class
java.util.ArrayList to Object Array for field f
org.apache.nifi.serialization.record.util.IllegalTypeConversionException:
Cannot convert value [[Document{{fid=5762addaffa7cf0980267acb, l=1.0}},
Document{{fid=5762adf32fc74d0418104201, l=2.12}},
Document{{fid=5762addd18b8b607802fec6f, l=3.32}},
Document{{fid=587542dd638e870838a79d08, l=1.0}},
Document{{fid=5762addbffa7cf0980267acd, l=3.32}}]] of type class
java.util.ArrayList to Object Array for field f
at
org.apache.nifi.serialization.record.util.DataTypeUtils.toArray(DataTypeUtils.java:347)
at
org.apache.nifi.serialization.record.util.DataTypeUtils.convertType(DataTypeUtils.java:153)
at
org.apache.nifi.serialization.record.util.DataTypeUtils.convertType(DataTypeUtils.java:115)
at org.apache.nifi.json.WriteJsonResult.writeValue(WriteJsonResult.java:284)
at
org.apache.nifi.json.WriteJsonResult.writeRecord(WriteJsonResult.java:187)
at
org.apache.nifi.json.WriteJsonResult.writeRecord(WriteJsonResult.java:136)
at
org.apache.nifi.serialization.AbstractRecordSetWriter.write(AbstractRecordSetWriter.java:59)
at
org.apache.nifi.processors.standard.AbstractRouteRecord$1.process(AbstractRouteRecord.java:148)
at
org.apache.nifi.controller.repository.StandardProcessSession.read(StandardProcessSession.java:2218)
at
org.apache.nifi.controller.repository.StandardProcessSession.read(StandardProcessSession.java:2186)
at
org.apache.nifi.processors.standard.AbstractRouteRecord.onTrigger(AbstractRouteRecord.java:121)
at
org.apache.nifi.processor.AbstractProcessor.onTrigger(AbstractProcessor.java:27)
at
org.apache.nifi.controller.StandardProcessorNode.onTrigger(StandardProcessorNode.java:1165)
at
org.apache.nifi.controller.tasks.ConnectableTask.invoke(ConnectableTask.java:203)
at
org.apache.nifi.controller.scheduling.TimerDrivenSchedulingAgent$1.run(TimerDrivenSchedulingAgent.java:117)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
2018-10-04 15:00:31,349 ERROR [Timer-Driven Process Thread-1]
o.a.n.processors.standard.LookupRecord
LookupRecord[id=339bf72c-91c3-36f0-ac14-bc8b734e2582] Failed to process
StandardFlowFileRecord[uuid=29b498fe-787f-4c62-a237-f95a8ebcb0b2,claim=StandardContentClaim
[resourceClaim=StandardResourceClaim[id=1538665215854-2, container=default,
section=2], offset=100486,
length=635840],offset=624238,name=1675395032391,size=11602]:
org.apache.nifi.serialization.record.util.IllegalTypeConversionException:
Cannot convert value [[Document{{fid=5762addaffa7cf0980267acb, l=1.0}},
Document{{fid=5762adf32fc74d0418104201, l=2.12}},
Document{{fid=5762addd18b8b607802fec6f, l=3.32}},
Document{{fid=587542dd638e870838a79d08, l=1.0}},
Document{{fid=5762addbffa7cf0980267acd, l=3.32}}]] of type class
java.util.ArrayList to Object Array for field f
org.apache.nifi.serialization.record.util.IllegalTypeConversionException:
Cannot convert value [[Document{{fid=5762addaffa7cf0980267acb, l=1.0}},
Document{{fid=5762adf32fc74d0418104201, l=2.12}},
Document{{fid=5762addd18b8b607802fec6f, l=3.32}},
Document{{fid=587542dd638e870838a79d08, l=1.0}},
Document{{fid=5762addbffa7cf0980267acd, l=3.32}}]] of type class
java.util.ArrayList to Object Array for field f
at
org.apache.nifi.serialization.record.util.DataTypeUtils.toArray(DataTypeUtils.java:347)
at
org.apache.nifi.serialization.record.util.DataTypeUtils.convertType(DataTypeUtils.java:153)
at
org.apache.nifi.serialization.record.util.DataTypeUtils.convertType(DataTypeUtils.java:115)
at org.apache.nifi.json.WriteJsonResult.writeValue(WriteJsonResult.java:284)
at
org.apache.nifi.json.WriteJsonResult.writeRecord(WriteJsonResult.java:187)
at
org.apache.nifi.json.WriteJsonResult.writeRecord(WriteJsonResult.java:136)
at
org.apache.nifi.serialization.AbstractRecordSetWriter.write(AbstractRecordSetWriter.java:59)
at
org.apache.nifi.processors.standard.AbstractRouteRecord$1.process(AbstractRouteRecord.java:148)
at
org.apache.nifi.controller.repository.StandardProcessSession.read(StandardProcessSession.java:2218)
at
org.apache.nifi.controller.repository.StandardProcessSession.read(StandardProcessSession.java:2186)
at
org.apache.nifi.processors.standard.AbstractRouteRecord.onTrigger(AbstractRouteRecord.java:121)
at
org.apache.nifi.processor.AbstractProcessor.onTrigger(AbstractProcessor.java:27)
at
org.apache.nifi.controller.StandardProcessorNode.onTrigger(StandardProcessorNode.java:1165)
at
org.apache.nifi.controller.tasks.ConnectableTask.invoke(ConnectableTask.java:203)
at
org.apache.nifi.controller.scheduling.TimerDrivenSchedulingAgent$1.run(TimerDrivenSchedulingAgent.java:117)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748){code}
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)