You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@avro.apache.org by "Bridger Howell (JIRA)" <ji...@apache.org> on 2017/10/24 14:33:00 UTC

[jira] [Commented] (AVRO-2099) Decimal precision is ignored

    [ https://issues.apache.org/jira/browse/AVRO-2099?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16217006#comment-16217006 ] 

Bridger Howell commented on AVRO-2099:
--------------------------------------

Good catch [~KornelKielczewski].

This is definitely unexpected behavior. I would expect values of a decimal logical type to be written with the right precision and read with the right precision.

My initial impression for making this make sense is to round to the specified precision before read and write. Does this seem reasonable?

> Decimal precision is ignored
> ----------------------------
>
>                 Key: AVRO-2099
>                 URL: https://issues.apache.org/jira/browse/AVRO-2099
>             Project: Avro
>          Issue Type: Improvement
>            Reporter: Kornel Kiełczewski
>
> According to the documentation https://avro.apache.org/docs/1.8.1/spec.html#Decimal 
> {quote}
> The decimal logical type represents an arbitrary-precision signed decimal number of the form unscaled × 10-scale.
> {quote}
> Then in the schema we might have an entry like:
> {code}
> {
>   "type": "bytes",
>   "logicalType": "decimal",
>   "precision": 4,
>   "scale": 2
> }
> {code}
> However, in the java deserialization I see that the precision is ignored:
> https://github.com/apache/avro/blob/master/lang/java/avro/src/main/java/org/apache/avro/Conversions.java#L79
> {code}
>     @Override
>     public BigDecimal fromBytes(ByteBuffer value, Schema schema, LogicalType type) {
>       int scale = ((LogicalTypes.Decimal) type).getScale();
>       // always copy the bytes out because BigInteger has no offset/length ctor
>       byte[] bytes = new byte[value.remaining()];
>       value.get(bytes);
>       return new BigDecimal(new BigInteger(bytes), scale);
>     }
> {code}
> The logical type definition in the java api requires the precision to be set:
> https://github.com/apache/avro/blob/master/lang/java/avro/src/main/java/org/apache/avro/LogicalTypes.java#L116
> {code}
>   /** Create a Decimal LogicalType with the given precision and scale */
>   public static Decimal decimal(int precision, int scale) {
>     return new Decimal(precision, scale);
>   }
> {code}
> Is this a feature, that we allow arbitrary precision? If so, why do we have the precision in the API and schema, if it's ignored?
> Maybe that's some java specific issue?
> Thanks for any hints.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)