From 75b49c248093e5b74fd9a40609c9eff1a8034b04 Mon Sep 17 00:00:00 2001 From: chetnachaudhari Date: Wed, 28 Sep 2016 13:36:47 +0530 Subject: [PATCH] HIVE-11812: Fixed datadiff udf division error --- .../hadoop/hive/ql/udf/generic/GenericUDFDateDiff.java | 2 +- .../hadoop/hive/ql/udf/generic/TestGenericUDFDateDiff.java | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDateDiff.java b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDateDiff.java index 403cf11..ebb5332 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDateDiff.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDateDiff.java @@ -175,7 +175,7 @@ private IntWritable evaluate(Date date, Date date2) { // by comparing with UTC epoch and integer division. // 86400 is the number of seconds in a day long diffInMilliSeconds = date.getTime() - date2.getTime(); - result.set((int) (diffInMilliSeconds / (86400 * 1000))); + result.set((int) Math.round((double) diffInMilliSeconds / (86400 * 1000))); return result; } } diff --git a/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFDateDiff.java b/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFDateDiff.java index af45af7..180b5c7 100644 --- a/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFDateDiff.java +++ b/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFDateDiff.java @@ -113,4 +113,18 @@ public void testDateWritablepToDate() throws HiveException { assertNull("date_add() both args null", udf.evaluate(args)); } + public void testDateDiffEvaluate() throws HiveException { + GenericUDFDateDiff udf = new GenericUDFDateDiff(); + ObjectInspector valueOI1 = PrimitiveObjectInspectorFactory.javaStringObjectInspector; + ObjectInspector valueOI2 = PrimitiveObjectInspectorFactory.javaStringObjectInspector; + ObjectInspector[] arguments = {valueOI1, valueOI2}; + + udf.initialize(arguments); + DeferredObject valueObj1 = new DeferredJavaObject(new Text("2015-09-14")); + DeferredObject valueObj2 = new DeferredJavaObject(new Text("2015-09-15")); + DeferredObject[] args = {valueObj1, valueObj2}; + IntWritable output = (IntWritable) udf.evaluate(args); + + assertEquals("date_diff() test for DATE failed ", "-1", output.toString()); + } } -- 2.7.0