diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/KeyWrapperFactory.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/KeyWrapperFactory.java index bf4ba7f386d07e20a0dedb60fd5811991e7b0810..839c8c6609168bc26212da9f74a37438724f6cd0 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/KeyWrapperFactory.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/KeyWrapperFactory.java @@ -21,6 +21,7 @@ import java.util.Arrays; import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.hive.serde2.lazy.LazyDouble; import org.apache.hadoop.hive.serde2.objectinspector.ListObjectsEqualComparer; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils; @@ -103,7 +104,23 @@ public boolean equals(Object obj) { @Override public void setHashKey() { - hashcode = Arrays.hashCode(keys); + if (keys == null) { + hashcode = 0; + } else { + + hashcode = 1; + for (Object element : keys) { + hashcode = 31 * hashcode; + if(element != null) { + if(element instanceof LazyDouble) { + long v = Double.doubleToLongBits(((LazyDouble)element).getWritableObject().get()); + hashcode = hashcode + (int) (v ^ (v >>> 32)); + } else { + hashcode = hashcode + element.hashCode(); + } + } + } + } } @Override