diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/spark/GenSparkUtils.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/spark/GenSparkUtils.java index 9bea4ddac9..61db701ecd 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/spark/GenSparkUtils.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/spark/GenSparkUtils.java @@ -28,6 +28,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.Stack; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hive.conf.HiveConf; @@ -617,17 +618,28 @@ private static boolean isSame(List list1, List list2 } @SuppressWarnings("unchecked") - public static T getChildOperator(Operator op, Class klazz) throws SemanticException { - if (klazz.isInstance(op)) { - return (T) op; - } - List> childOperators = op.getChildOperators(); - for (Operator childOp : childOperators) { - T result = getChildOperator(childOp, klazz); - if (result != null) { - return result; + public static T getChildOperator(Operator root, Class klazz) throws SemanticException { + if (root == null) return null; + + HashSet> opSet = new HashSet>(); + Stack> stack = new Stack>(); + stack.push(root); + opSet.add(root); + + while (!stack.isEmpty()) { + Operator op = stack.pop(); + if (klazz.isInstance(op)) { + return (T) op; + } + List> childOperators = op.getChildOperators(); + for (Operator childOp : childOperators) { + if (!opSet.contains(childOp)) { + stack.push(childOp); + opSet.add(childOp); + } } } + return null; }