commit c107be37340940c34e715f679fcafb955789a0e9 Author: kellyzly Date: Sun May 7 23:01:19 2017 -0400 HIVE-16600.1.patch diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/spark/SetSparkReducerParallelism.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/spark/SetSparkReducerParallelism.java index 337f418..46b4f18 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/spark/SetSparkReducerParallelism.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/spark/SetSparkReducerParallelism.java @@ -202,16 +202,28 @@ private boolean needSetParallelism(ReduceSinkOperator reduceSink, HiveConf hiveC } if (desc.getNumReducers() == 1 && desc.hasOrderBy() && hiveConf.getBoolVar(HiveConf.ConfVars.HIVESAMPLINGFORORDERBY) && !desc.isDeduplicated()) { + Stack> descendants = new Stack>(); List> children = reduceSink.getChildOperators(); - while (children != null && children.size() > 0) { - if (children.size() != 1 || children.get(0) instanceof LimitOperator) { + if (children != null) { + for (Operator child : children) { + descendants.push(child); + } + } + while (descendants.size() != 0) { + Operator descendant = descendants.pop(); + if (descendant instanceof LimitOperator) { return false; } - if (children.get(0) instanceof ReduceSinkOperator || - children.get(0) instanceof FileSinkOperator) { - break; + boolean reachRSOrFS = (descendant instanceof ReduceSinkOperator || + descendant instanceof FileSinkOperator); + if (!reachRSOrFS) { + List> childrenOfDescendant = descendant.getChildOperators(); + if (childrenOfDescendant != null) { + for (Operator childOfDescendant : childrenOfDescendant) { + descendants.push(childOfDescendant); + } + } } - children = children.get(0).getChildOperators(); } return true; }