diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/StatsOptimizer.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/StatsOptimizer.java index e490627346..d26a48b784 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/StatsOptimizer.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/StatsOptimizer.java @@ -320,7 +320,7 @@ else if (getGbyKeyType(cgbyOp) == GbyKeyType.CONSTANT && rowCnt == 0) { } Operator last = (Operator) stack.get(5); SelectOperator cselOp = null; - Map posToConstant = new HashMap<>(); + Map posToConstant = new LinkedHashMap<>(); if (last instanceof SelectOperator) { cselOp = (SelectOperator) last; if (!cselOp.isIdentitySelect()) { @@ -338,6 +338,17 @@ else if (getGbyKeyType(cgbyOp) == GbyKeyType.CONSTANT && rowCnt == 0) { } } last = (Operator) stack.get(6); + } else { + // Add constants if there is no SELECT on top + GroupByDesc gbyDesc = cgbyOp.getConf(); + int numCols = gbyDesc.getOutputColumnNames().size(); + int aggCols = gbyDesc.getAggregators().size(); + List dpCols = cgbyOp.getSchema().getColumnNames().subList(0, numCols - aggCols); + for(int i = 0; i < dpCols.size(); i++) { + ExprNodeDesc end = ExprNodeDescUtils.findConstantExprOrigin(dpCols.get(i), cgbyOp); + assert end instanceof ExprNodeConstantDesc; + posToConstant.put(i, ((ExprNodeConstantDesc)end).getValue()); + } } FileSinkOperator fsOp = (FileSinkOperator)last; if (fsOp.getNumChild() > 0) { @@ -707,7 +718,10 @@ else if (udaf instanceof GenericUDAFCount) { List colNames = new ArrayList(); List ois = new ArrayList(); if (cselOp == null) { - allRows.add(oneRow); + List oneRowWithConstant = new ArrayList<>(); + oneRowWithConstant.addAll(posToConstant.values()); + oneRowWithConstant.addAll(oneRow); + allRows.add(oneRowWithConstant); for (ColumnInfo colInfo : cgbyOp.getSchema().getSignature()) { colNames.add(colInfo.getInternalName()); ois.add(TypeInfoUtils.getStandardJavaObjectInspectorFromTypeInfo(colInfo.getType()));