You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by jc...@apache.org on 2019/11/27 07:22:47 UTC

[hive] branch master updated: HIVE-22507: KeyWrapper comparator create field comparator instances at every comparison (Krisztian Kasa, reviewed by Jesus Camacho Rodriguez)

This is an automated email from the ASF dual-hosted git repository.

jcamacho pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hive.git


The following commit(s) were added to refs/heads/master by this push:
     new 2ea050b  HIVE-22507: KeyWrapper comparator create field comparator instances at every comparison (Krisztian Kasa, reviewed by Jesus Camacho Rodriguez)
2ea050b is described below

commit 2ea050b39e2e98712072ee2c3e63dcec23cdc1b0
Author: Krisztian Kasa <kk...@cloudera.com>
AuthorDate: Tue Nov 26 23:21:31 2019 -0800

    HIVE-22507: KeyWrapper comparator create field comparator instances at every comparison (Krisztian Kasa, reviewed by Jesus Camacho Rodriguez)
---
 .../apache/hadoop/hive/ql/exec/TopNKeyOperator.java | 21 ++++++++++-----------
 .../objectinspector/ObjectInspectorUtils.java       | 14 ++++++--------
 2 files changed, 16 insertions(+), 19 deletions(-)

diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/TopNKeyOperator.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/TopNKeyOperator.java
index b3ab701..4e35922 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/exec/TopNKeyOperator.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/TopNKeyOperator.java
@@ -30,8 +30,10 @@ import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils;
 
 import java.io.Serializable;
 import java.util.Comparator;
+import java.util.List;
 
 import static org.apache.hadoop.hive.ql.plan.api.OperatorType.TOPNKEY;
+import static org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils.NullValueOption;
 
 /**
  * TopNKeyOperator passes rows that contains top N keys only.
@@ -55,25 +57,22 @@ public class TopNKeyOperator extends Operator<TopNKeyDesc> implements Serializab
 
   public static class KeyWrapperComparator implements Comparator<KeyWrapper> {
 
-    private final ObjectInspector[] keyObjectInspectors;
-    private final boolean[] columnSortOrderIsDesc;
-    private final ObjectInspectorUtils.NullValueOption[] nullSortOrder;
+    private final List<Comparator<Object>> comparatorList;
 
     KeyWrapperComparator(ObjectInspector[] keyObjectInspectors, String columnSortOrder, String nullSortOrder) {
-      this.keyObjectInspectors = keyObjectInspectors;
-      this.columnSortOrderIsDesc = new boolean[columnSortOrder.length()];
-      this.nullSortOrder = new ObjectInspectorUtils.NullValueOption[nullSortOrder.length()];
+      boolean[] columnSortOrderIsDesc = new boolean[columnSortOrder.length()];
+      NullValueOption[] nullSortOrderArray = new NullValueOption[nullSortOrder.length()];
       for (int i = 0; i < columnSortOrder.length(); ++i) {
-        this.columnSortOrderIsDesc[i] = columnSortOrder.charAt(i) == '-';
-        this.nullSortOrder[i] = NullOrdering.fromSign(nullSortOrder.charAt(i)).getNullValueOption();
+        columnSortOrderIsDesc[i] = columnSortOrder.charAt(i) == '-';
+        nullSortOrderArray[i] = NullOrdering.fromSign(nullSortOrder.charAt(i)).getNullValueOption();
       }
+      comparatorList = ObjectInspectorUtils.getComparator(
+              keyObjectInspectors, keyObjectInspectors, columnSortOrderIsDesc, nullSortOrderArray);
     }
 
     @Override
     public int compare(KeyWrapper key1, KeyWrapper key2) {
-      return ObjectInspectorUtils.compare(
-              key1.getKeyArray(), keyObjectInspectors, key2.getKeyArray(), keyObjectInspectors,
-              columnSortOrderIsDesc, nullSortOrder);
+      return ObjectInspectorUtils.compare(comparatorList, key1.getKeyArray(), key2.getKeyArray());
     }
   }
 
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 ab1cfdc..1f3bbaf 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
@@ -948,14 +948,12 @@ public final class ObjectInspectorUtils {
     return 0;
   }
 
-  public static int compare(
-          Object[] objectArray1, ObjectInspector[] oi1, Object[] objectArray2, ObjectInspector[] oi2,
+  public static List<Comparator<Object>> getComparator(
+          ObjectInspector[] oi1, ObjectInspector[] oi2,
           boolean[] columnSortOrderIsDesc, NullValueOption[] nullSortOrder) {
-    assert (objectArray1.length == objectArray2.length);
-    assert (objectArray1.length == oi1.length);
-    assert (objectArray2.length == oi2.length);
-    assert (columnSortOrderIsDesc.length == objectArray1.length);
-    assert (nullSortOrder.length == objectArray1.length);
+    assert (oi1.length == oi2.length);
+    assert (columnSortOrderIsDesc.length == oi1.length);
+    assert (nullSortOrder.length == oi1.length);
 
     List<Comparator<Object>> comparators = new ArrayList<>(oi1.length);
     for (int i = 0; i < oi1.length; i++) {
@@ -975,7 +973,7 @@ public final class ObjectInspectorUtils {
       }
     }
 
-    return compare(comparators, objectArray1, objectArray2);
+    return comparators;
   }
 
   public static <T> int compare(List<Comparator<T>> comparatorList, T[] o1, T[] o2) {