Koji Kawamura created NIFI-4844:
-----------------------------------
Summary: AvroRecordSetWriter should be able to convert a double
having less scale than intended target Avro schema instead of throwing an
AvroTypeException
Key: NIFI-4844
URL: https://issues.apache.org/jira/browse/NIFI-4844
Project: Apache NiFi
Issue Type: Bug
Components: Extensions
Affects Versions: 1.3.0
Reporter: Koji Kawamura
Assignee: Koji Kawamura
Current AvroTypeUtil conversion logic can throw AvroTypeException when it maps
double values into Avro decimal logical type fields if the double value has
less scale than the one defined at the target Avro decimal field schema.
For example, with following schema:
{code}
{
"type": "record",
"name": "logicalDecimalTest",
"fields": [
{"name": "id", "type": "int"},
{"name": "name", "type": "string"},
{
"name": "price",
"type": {
"type": "bytes",
"logicalType": "decimal",
"precision": 18,
"scale": 8
}}]}
{code}
And following CSV records:
{code}
id|name|price
1|one|1.23
2|two|2.34
{code}
Would produce this Exception:
{code}
2018-02-06 09:57:27,461 ERROR [Timer-Driven Process Thread-7]
o.a.n.processors.standard.ConvertRecord
ConvertRecord[id=6897bc30-0161-1000-a8e7-9ce0ce8eb9ae] Failed to process
StandardFlowFileRecord[uuid=a97366a0-79bb-42ff-9023-c5d62ecfdbc5,claim=StandardContentClaim
[resourceClaim=StandardResourceClaim[id=1517878123416-2, container=default,
section=2], offset=5, length=48],offset=0,name=220105646548465,size=48]; will
route to failure: org.apache.avro.AvroTypeException: Cannot encode decimal with
scale 17 as scale 8
org.apache.avro.AvroTypeException: Cannot encode decimal with scale 17 as scale
8
at
org.apache.avro.Conversions$DecimalConversion.toBytes(Conversions.java:86)
at
org.apache.nifi.avro.AvroTypeUtil.convertToAvroObject(AvroTypeUtil.java:546)
at
org.apache.nifi.avro.AvroTypeUtil.createAvroRecord(AvroTypeUtil.java:457)
at
org.apache.nifi.avro.WriteAvroResultWithExternalSchema.writeRecord(WriteAvroResultWithExternalSchema.java:76)
at
org.apache.nifi.serialization.AbstractRecordSetWriter.write(AbstractRecordSetWriter.java:59)
at
org.apache.nifi.processors.standard.AbstractRecordProcessor$1.process(AbstractRecordProcessor.java:122)
at
org.apache.nifi.controller.repository.StandardProcessSession.write(StandardProcessSession.java:2827)
at
org.apache.nifi.processors.standard.AbstractRecordProcessor.onTrigger(AbstractRecordProcessor.java:109)
at
org.apache.nifi.processor.AbstractProcessor.onTrigger(AbstractProcessor.java:27)
at
org.apache.nifi.controller.StandardProcessorNode.onTrigger(StandardProcessorNode.java:1122)
at
org.apache.nifi.controller.tasks.ContinuallyRunProcessorTask.call(ContinuallyRunProcessorTask.java:147)
at
org.apache.nifi.controller.tasks.ContinuallyRunProcessorTask.call(ContinuallyRunProcessorTask.java:47)
at
org.apache.nifi.controller.scheduling.TimerDrivenSchedulingAgent$1.run(TimerDrivenSchedulingAgent.java:128)
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:1142)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
{code}
The same issue is reported in the Avro project,
[AVRO-1864|https://issues.apache.org/jira/browse/AVRO-1864]. The recommended
approach is to adjust the scale at NiFi side. Actually, for BigDecimal input
values, NiFi already does this, but not with double values. AvroTypeUtil should
do the same scale adjustment for double values, too.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)