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..22bd951473aee3d73c06b93817f19dfa5766d8d6 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,22 @@ 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