diff --git ql/src/java/org/apache/hadoop/hive/ql/optimizer/OperatorComparatorFactory.java ql/src/java/org/apache/hadoop/hive/ql/optimizer/OperatorComparatorFactory.java index 0373e53..4025e53 100644 --- ql/src/java/org/apache/hadoop/hive/ql/optimizer/OperatorComparatorFactory.java +++ ql/src/java/org/apache/hadoop/hive/ql/optimizer/OperatorComparatorFactory.java @@ -191,7 +191,7 @@ public boolean equals(SelectOperator op1, SelectOperator op2) { SelectDesc op1Conf = op1.getConf(); SelectDesc op2Conf = op2.getConf(); - if (compareString(op1Conf.getColListString(), op2Conf.getColListString()) && + if (compareString(op1Conf.getCachedColListString(), op2Conf.getCachedColListString()) && compareObject(op1Conf.getOutputColumnNames(), op2Conf.getOutputColumnNames()) && compareString(op1Conf.explainNoCompute(), op2Conf.explainNoCompute())) { return true; @@ -210,7 +210,7 @@ public boolean equals(VectorSelectOperator op1, VectorSelectOperator op2) { SelectDesc op1Conf = op1.getConf(); SelectDesc op2Conf = op2.getConf(); - if (compareString(op1Conf.getColListString(), op2Conf.getColListString()) && + if (compareString(op1Conf.getCachedColListString(), op2Conf.getCachedColListString()) && compareObject(op1Conf.getOutputColumnNames(), op2Conf.getOutputColumnNames()) && compareString(op1Conf.explainNoCompute(), op2Conf.explainNoCompute())) { return true; @@ -229,7 +229,7 @@ public boolean equals(FilterOperator op1, FilterOperator op2) { FilterDesc op1Conf = op1.getConf(); FilterDesc op2Conf = op2.getConf(); - if (compareString(op1Conf.getPredicateString(), op2Conf.getPredicateString()) && + if (compareString(op1Conf.getCachedPredicatedString(), op2Conf.getCachedPredicatedString()) && (op1Conf.getIsSamplingPred() == op2Conf.getIsSamplingPred()) && compareString(op1Conf.getSampleDescExpr(), op2Conf.getSampleDescExpr())) { return true; @@ -365,7 +365,7 @@ public boolean equals(MapJoinOperator op1, MapJoinOperator op2) { MapJoinDesc desc2 = op2.getConf(); if (compareObject(desc1.getParentToInput(), desc2.getParentToInput()) && - compareString(desc1.getKeyCountsExplainDesc(), desc2.getKeyCountsExplainDesc()) && + compareString(desc1.getCachedKeyCountsExplainDesc(), desc2.getCachedKeyCountsExplainDesc()) && compareObject(desc1.getKeysString(), desc2.getKeysString()) && desc1.getPosBigTable() == desc2.getPosBigTable() && desc1.isBucketMapJoin() == desc2.isBucketMapJoin() && @@ -391,7 +391,7 @@ public boolean equals(CommonMergeJoinOperator op1, CommonMergeJoinOperator op2) CommonMergeJoinDesc desc2 = op2.getConf(); if (compareObject(desc1.getParentToInput(), desc2.getParentToInput()) && - compareString(desc1.getKeyCountsExplainDesc(), desc2.getKeyCountsExplainDesc()) && + compareString(desc1.getCachedKeyCountsExplainDesc(), desc2.getCachedKeyCountsExplainDesc()) && compareObject(desc1.getKeysString(), desc2.getKeysString()) && desc1.getPosBigTable() == desc2.getPosBigTable() && desc1.isBucketMapJoin() == desc2.isBucketMapJoin() && @@ -418,7 +418,7 @@ public boolean equals(SMBMapJoinOperator op1, SMBMapJoinOperator op2) { SMBJoinDesc desc2 = op2.getConf(); if (compareObject(desc1.getParentToInput(), desc2.getParentToInput()) && - compareString(desc1.getKeyCountsExplainDesc(), desc2.getKeyCountsExplainDesc()) && + compareString(desc1.getCachedKeyCountsExplainDesc(), desc2.getCachedKeyCountsExplainDesc()) && compareObject(desc1.getKeysString(), desc2.getKeysString()) && desc1.getPosBigTable() == desc2.getPosBigTable() && desc1.isBucketMapJoin() == desc2.isBucketMapJoin() && diff --git ql/src/java/org/apache/hadoop/hive/ql/optimizer/SharedWorkOptimizer.java ql/src/java/org/apache/hadoop/hive/ql/optimizer/SharedWorkOptimizer.java index 8070c2a..61d4f0e 100644 --- ql/src/java/org/apache/hadoop/hive/ql/optimizer/SharedWorkOptimizer.java +++ ql/src/java/org/apache/hadoop/hive/ql/optimizer/SharedWorkOptimizer.java @@ -776,14 +776,13 @@ private static boolean compareOperator(ParseContext pctx, Operator op1, Opera TableScanDesc op1Conf = tsOp1.getConf(); TableScanDesc op2Conf = tsOp2.getConf(); - if (StringUtils.equals( - op1Conf.getTableMetadata().getDbName() + "." + op1Conf.getTableMetadata().getTableName(), - op2Conf.getTableMetadata().getDbName() + "." + op2Conf.getTableMetadata().getTableName()) && - op1Conf.getNeededColumns().equals(op2Conf.getNeededColumns()) && - StringUtils.equals(op1Conf.getFilterExprString(), op2Conf.getFilterExprString()) && - pctx.getPrunedPartitions(tsOp1).getPartitions().equals( + if (StringUtils.equals(op1Conf.getTableMetadata().getDbName(), op2Conf.getTableMetadata().getDbName()) && + StringUtils.equals( op1Conf.getTableMetadata().getTableName(), op2Conf.getTableMetadata().getTableName()) && + op1Conf.getNeededColumns().equals(op2Conf.getNeededColumns()) && + StringUtils.equals(op1Conf.getFilterExprString(), op2Conf.getFilterExprString()) && + pctx.getPrunedPartitions(tsOp1).getPartitions().equals( pctx.getPrunedPartitions(tsOp2).getPartitions()) && - op1Conf.getRowLimit() == op2Conf.getRowLimit()) { + op1Conf.getRowLimit() == op2Conf.getRowLimit()) { return true; } else { return false; diff --git ql/src/java/org/apache/hadoop/hive/ql/plan/FilterDesc.java ql/src/java/org/apache/hadoop/hive/ql/plan/FilterDesc.java index e93660a..8187c8c 100644 --- ql/src/java/org/apache/hadoop/hive/ql/plan/FilterDesc.java +++ ql/src/java/org/apache/hadoop/hive/ql/plan/FilterDesc.java @@ -88,6 +88,7 @@ public String toString() { //Is this a filter that should perform a comparison for sorted searches private boolean isSortedFilter; private transient boolean isGenerated; + private transient String predicateString; public FilterDesc() { } @@ -108,6 +109,13 @@ public FilterDesc( this.sampleDescr = sampleDescr; } + public String getCachedPredicatedString() { + if (predicateString == null) { + predicateString = getPredicateString(); + } + return predicateString; + } + @Explain(displayName = "predicate") public String getPredicateString() { return PlanUtils.getExprListString(Arrays.asList(predicate)); diff --git ql/src/java/org/apache/hadoop/hive/ql/plan/MapJoinDesc.java ql/src/java/org/apache/hadoop/hive/ql/plan/MapJoinDesc.java index 0d8e459..c53d2a4 100644 --- ql/src/java/org/apache/hadoop/hive/ql/plan/MapJoinDesc.java +++ ql/src/java/org/apache/hadoop/hive/ql/plan/MapJoinDesc.java @@ -81,6 +81,8 @@ private boolean isHybridHashJoin; private boolean isDynamicPartitionHashJoin = false; + private transient String keyCountsExplainString; + public MapJoinDesc() { vectorDesc = null; bigTableBucketNumMapping = new LinkedHashMap(); @@ -159,6 +161,13 @@ public void setParentToInput(Map parentToInput) { return parentDataSizes; } + public String getCachedKeyCountsExplainDesc() { + if (keyCountsExplainString == null) { + keyCountsExplainString = getKeyCountsExplainDesc(); + } + return keyCountsExplainString; + } + @Explain(displayName = "Estimated key counts", explainLevels = { Level.EXTENDED }) public String getKeyCountsExplainDesc() { StringBuilder result = null; diff --git ql/src/java/org/apache/hadoop/hive/ql/plan/SelectDesc.java ql/src/java/org/apache/hadoop/hive/ql/plan/SelectDesc.java index 0601ce0..1a82df2 100644 --- ql/src/java/org/apache/hadoop/hive/ql/plan/SelectDesc.java +++ ql/src/java/org/apache/hadoop/hive/ql/plan/SelectDesc.java @@ -37,6 +37,7 @@ private List outputColumnNames; private boolean selectStar; private boolean selStarNoCompute; + private transient String exprListString; public SelectDesc() { } @@ -71,6 +72,13 @@ public Object clone() { return ret; } + public String getCachedColListString() { + if (exprListString == null) { + exprListString = PlanUtils.getExprListString(colList); + } + return exprListString; + } + @Explain(displayName = "expressions") public String getColListString() { return PlanUtils.getExprListString(colList);