[ https://issues.apache.org/jira/browse/HIVE-19523?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16482951#comment-16482951 ]
Sergey Shelukhin commented on HIVE-19523: ----------------------------------------- [~ashutoshc] [~jcamachorodriguez] do you have any input? Seems like this would be behavior change for Hive. I am not sure why Hive would change precision/scale, but I'm assuming it's there for some reason... not changing it seems more logical to me. > Decimal truncation for trailing zeros in Hive 1.2.1 > --------------------------------------------------- > > Key: HIVE-19523 > URL: https://issues.apache.org/jira/browse/HIVE-19523 > Project: Hive > Issue Type: Bug > Components: Hive > Affects Versions: 1.2.1, 2.3.1 > Reporter: vinay kant garg > Priority: Critical > > This issue is related to the unnecessary truncation of zero's while > serializing BigDecimal object to HiveDecimal object. > BigDecimal object has info about scale and precision still serializing ended > up modifying scale and precision metadata as well truncation of zero's. > Eg: if our BigDecimal val is : 47.6300, scale = 4 and precision = 6. If I am > serializing this to HiveDecimal by using API hive expose : > static HiveDecimal create(BigDecimal b) > static HiveDecimal create(BigDecimal b, boolean allowRounding) > our output will be : val = 47.63, scale = 2 and precision = 4. > or if IP: val = 47.00, scale = 2 and precision = 4 then > OP: val = 47, scale = 0 and precision = 2 > *In above example if we see there is no DATA CORRUPTION because 47.6300 is > equivalent to 47.63 or 47.00 is equivalent to 47 but later on if this data is > used to identify whether it is integer or decimal then we may run into weird > issues because 47.00 is decimal but 47 is an integer*. > I am able to reproduce this issue even with standalone program: > *import java.math.BigDecimal;* > *import org.apache.hadoop.hive.common.type.HiveDecimal;* > *public class testHivedecimal {* > *public static void main(String[] argv){* > *BigDecimal bd = new BigDecimal ("47.6300");* > *bd.setScale(4);* > *System.out.println("bigdecimal object created and value is : " + > bd.toString());* > *System.out.println("precision : "+ bd.precision());* > *System.out.println("scale : "+ bd.scale());* > *HiveDecimal hv = HiveDecimal.create(bd);* > *String str = hv.toString();* > *System.out.println("value after serialization of bigdecimal to hivedecimal > : " + str);* > *System.out.println("precision after hivedecimal : "+ hv.precision());* > *System.out.println("scale after hivedecimal : "+ hv.scale());* > *}* > *}* > you can use above program to reproduce issue: > To Compile: > 1) use jdk8_u72 > 2) command : javac -cp hive-common-1.2.1000.2.6.0.3-8.jar:. > testHivedecimal.java > To Run: > 1) use jdk8_u72 > 2) command : java -cp hive-common-1.2.1000.2.6.0.3-8.jar:. testHivedecimal > -- This message was sent by Atlassian JIRA (v7.6.3#76005)