You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@nifi.apache.org by "Toivo Adams (JIRA)" <ji...@apache.org> on 2016/09/03 08:49:21 UTC
[jira] [Comment Edited] (NIFI-2624) JDBC-to-Avro processors handle
BigDecimals as Strings
[ https://issues.apache.org/jira/browse/NIFI-2624?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15460710#comment-15460710 ]
Toivo Adams edited comment on NIFI-2624 at 9/3/16 8:49 AM:
-----------------------------------------------------------
Note!! BigInteger handling is not yet changed.
I am not sure how Avro supports DECIMAL types.
Current solution looks clumsy.
You can’t put BigDecimal value directly to Avro record, like
rec.put(i - 1, bigDecimalValue);
Avro will throw
org.apache.avro.AvroRuntimeException: Unknown datum type java.math.BigDecimal: 38
Instead you need to convert value to bytes, like
Schema decimalSchema = getDecimalSchema(schema, meta.getColumnName(i));
LogicalType logicalType = LogicalTypes.fromSchema(decimalSchema);
ByteBuffer byteBuffer = decimalConversion.toBytes((BigDecimal) value, decimalSchema, logicalType);
rec.put(i - 1, byteBuffer);
And getting BigDecimal value from record is equally weird:
record = dataFileReader.next(record);
DecimalConversion decimalConversion = new DecimalConversion();
Schema schema = record.getSchema();
Schema decimalSchema = getDecimalSchema(schema, "Chairman");
LogicalType logicalType = LogicalTypes.fromSchema(decimalSchema);
ByteBuffer buffer = (ByteBuffer) record.get("Chairman");
BigDecimal resultBD = decimalConversion.fromBytes(buffer, schema, logicalType);
I am not sure how to handle BigInteger, because its seems DecimalConversion supports only BigDecimal.
Thanks
Toivo
was (Author: toivo adams):
Note!! BigInteger handling is not yet changed.
I am not sure how Avro supports DECIMAL types.
Current solution looks clumsy.
You can’ put BigDecimal value directly to Avro record, like
rec.put(i - 1, bigDecimalValue);
Avro will throw
org.apache.avro.AvroRuntimeException: Unknown datum type java.math.BigDecimal: 38
Instead you need to convert value to bytes, like
Schema decimalSchema = getDecimalSchema(schema, meta.getColumnName(i));
LogicalType logicalType = LogicalTypes.fromSchema(decimalSchema);
ByteBuffer byteBuffer = decimalConversion.toBytes((BigDecimal) value, decimalSchema, logicalType);
rec.put(i - 1, byteBuffer);
And getting BigDecimal value from record is equally weird:
record = dataFileReader.next(record);
DecimalConversion decimalConversion = new DecimalConversion();
Schema schema = record.getSchema();
Schema decimalSchema = getDecimalSchema(schema, "Chairman");
LogicalType logicalType = LogicalTypes.fromSchema(decimalSchema);
ByteBuffer buffer = (ByteBuffer) record.get("Chairman");
BigDecimal resultBD = decimalConversion.fromBytes(buffer, schema, logicalType);
I am not sure how to handle BigInteger, because its seems DecimalConversion supports only BigDecimal.
Thanks
Toivo
> JDBC-to-Avro processors handle BigDecimals as Strings
> -----------------------------------------------------
>
> Key: NIFI-2624
> URL: https://issues.apache.org/jira/browse/NIFI-2624
> Project: Apache NiFi
> Issue Type: Improvement
> Components: Extensions
> Reporter: Matt Burgess
> Assignee: Toivo Adams
>
> The original SQL processors implemented BigDecimal values as Strings for
> Avro, as the version of Avro it used (1.7.6) did not support DECIMAL type.
> As of Avro 1.7.7 (AVRO-1402), this type is supported and so the SQL/HiveQL processors should be updated to handle BigDecimals correctly if possible.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)