diff --git a/serde/src/java/org/apache/hadoop/hive/serde2/io/DateWritableV2.java b/serde/src/java/org/apache/hadoop/hive/serde2/io/DateWritableV2.java index ba7760808d..4b6a3d6c10 100644 --- a/serde/src/java/org/apache/hadoop/hive/serde2/io/DateWritableV2.java +++ b/serde/src/java/org/apache/hadoop/hive/serde2/io/DateWritableV2.java @@ -149,6 +149,6 @@ public String toString() { @Override public int hashCode() { - return date.hashCode(); + return date.toEpochDay(); } } diff --git a/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorUtils.java b/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorUtils.java index 044fd16720..df6e788fb7 100644 --- a/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorUtils.java +++ b/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorUtils.java @@ -31,6 +31,7 @@ import org.apache.hadoop.hive.serde2.io.DateWritableV2; import org.apache.hadoop.hive.serde2.io.TimestampLocalTZWritable; +import org.apache.hadoop.hive.serde2.io.TimestampWritable; import org.apache.hadoop.hive.serde2.io.TimestampWritableV2; import org.apache.hadoop.hive.serde2.objectinspector.primitive.SettableTimestampLocalTZObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.primitive.TimestampLocalTZObjectInspector; @@ -718,9 +719,11 @@ public static int hashCode(Object o, ObjectInspector objIns) { case DATE: return ((DateObjectInspector) poi).getPrimitiveWritableObject(o).hashCode(); case TIMESTAMP: - TimestampWritableV2 t = ((TimestampObjectInspector) poi) - .getPrimitiveWritableObject(o); - return t.hashCode(); + // Use old timestamp writable hash code for backwards compatibility + TimestampWritable ts = new TimestampWritable( + java.sql.Timestamp.valueOf( + ((TimestampObjectInspector) poi).getPrimitiveWritableObject(o).toString())); + return ts.hashCode(); case TIMESTAMPLOCALTZ: TimestampLocalTZWritable tstz = ((TimestampLocalTZObjectInspector) poi).getPrimitiveWritableObject(o); return tstz.hashCode(); diff --git a/serde/src/test/org/apache/hadoop/hive/serde2/objectinspector/TestObjectInspectorUtils.java b/serde/src/test/org/apache/hadoop/hive/serde2/objectinspector/TestObjectInspectorUtils.java index 23ca194b6f..5f90e22671 100644 --- a/serde/src/test/org/apache/hadoop/hive/serde2/objectinspector/TestObjectInspectorUtils.java +++ b/serde/src/test/org/apache/hadoop/hive/serde2/objectinspector/TestObjectInspectorUtils.java @@ -23,6 +23,8 @@ import junit.framework.TestCase; +import org.apache.hadoop.hive.common.type.Date; +import org.apache.hadoop.hive.common.type.Timestamp; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector.Category; import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory; import org.apache.hadoop.hive.serde2.thrift.test.Complex; @@ -131,6 +133,7 @@ public void testObjectInspectorUtils() throws Throwable { } } + public void testBucketIdGeneration() { ArrayList fieldNames = new ArrayList(); fieldNames.add("firstInteger"); @@ -156,4 +159,32 @@ public void testBucketIdGeneration() { assertEquals("", 6, bucketId); assertEquals("", bucketId, ObjectInspectorUtils.getBucketNumber(hashCode, 16)); } + + public void testBucketHashGeneration() { + ArrayList fieldNames = new ArrayList(); + fieldNames.add("d"); + fieldNames.add("ts"); + ArrayList fieldObjectInspectors = new ArrayList(); + fieldObjectInspectors + .add(PrimitiveObjectInspectorFactory.javaDateObjectInspector); + fieldObjectInspectors + .add(PrimitiveObjectInspectorFactory.javaTimestampObjectInspector); + fieldObjectInspectors + .add(PrimitiveObjectInspectorFactory.javaTimestampObjectInspector); + + StandardStructObjectInspector soi1 = ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldObjectInspectors); + ArrayList struct = new ArrayList(2); + struct.add(Date.of(1970, 1, 1)); + struct.add(Timestamp.valueOf("1969-12-31 16:00:00")); + struct.add(Timestamp.valueOf("1970-01-01 00:00:00")); + + Object[] bucketFields = struct.toArray(); + ObjectInspector[] bucketFieldInspectors = fieldObjectInspectors.toArray(new ObjectInspector[fieldObjectInspectors.size()]); + int fieldHash = ObjectInspectorUtils.hashCode(bucketFields[0], bucketFieldInspectors[0]); + assertEquals("", 0, fieldHash); + fieldHash = ObjectInspectorUtils.hashCode(bucketFields[1], bucketFieldInspectors[1]); + assertEquals("", 0, fieldHash); + fieldHash = ObjectInspectorUtils.hashCode(bucketFields[2], bucketFieldInspectors[2]); + assertEquals("", 7200, fieldHash); + } }