Return-Path: X-Original-To: apmail-hive-commits-archive@www.apache.org Delivered-To: apmail-hive-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 2296018F23 for ; Tue, 15 Dec 2015 19:31:38 +0000 (UTC) Received: (qmail 9082 invoked by uid 500); 15 Dec 2015 19:31:38 -0000 Delivered-To: apmail-hive-commits-archive@hive.apache.org Received: (qmail 9033 invoked by uid 500); 15 Dec 2015 19:31:38 -0000 Mailing-List: contact commits-help@hive.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: hive-dev@hive.apache.org Delivered-To: mailing list commits@hive.apache.org Received: (qmail 9022 invoked by uid 99); 15 Dec 2015 19:31:37 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 15 Dec 2015 19:31:37 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 7F3B9E0513; Tue, 15 Dec 2015 19:31:37 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: harisankar@apache.org To: commits@hive.apache.org Message-Id: X-Mailer: ASF-Git Admin Mailer Subject: hive git commit: HIVE-12666: PCRExprProcFactory.GenericFuncExprProcessor.process() aggressively removes dynamic partition pruner generated synthetic join predicates (Hari Subramaniyan, reviewed by Laljo John Pullokkaran) Date: Tue, 15 Dec 2015 19:31:37 +0000 (UTC) Repository: hive Updated Branches: refs/heads/master be98f0133 -> 25c207c93 HIVE-12666: PCRExprProcFactory.GenericFuncExprProcessor.process() aggressively removes dynamic partition pruner generated synthetic join predicates (Hari Subramaniyan, reviewed by Laljo John Pullokkaran) Project: http://git-wip-us.apache.org/repos/asf/hive/repo Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/25c207c9 Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/25c207c9 Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/25c207c9 Branch: refs/heads/master Commit: 25c207c9398b2722d594837f011c12d497aeae43 Parents: be98f01 Author: Hari Subramaniyan Authored: Tue Dec 15 11:31:26 2015 -0800 Committer: Hari Subramaniyan Committed: Tue Dec 15 11:31:26 2015 -0800 ---------------------------------------------------------------------- .../DynamicPartitionPruningOptimization.java | 73 +++++++++----------- .../ql/optimizer/pcr/PcrExprProcFactory.java | 31 ++++++--- .../llap/dynamic_partition_pruning.q.out | 10 +-- .../vectorized_dynamic_partition_pruning.q.out | 10 +-- .../tez/dynamic_partition_pruning.q.out | 10 +-- .../results/clientpositive/tez/mergejoin.q.out | 2 - .../vectorized_dynamic_partition_pruning.q.out | 10 +-- 7 files changed, 64 insertions(+), 82 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hive/blob/25c207c9/ql/src/java/org/apache/hadoop/hive/ql/optimizer/DynamicPartitionPruningOptimization.java ---------------------------------------------------------------------- diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/DynamicPartitionPruningOptimization.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/DynamicPartitionPruningOptimization.java index c2749a8..292d375 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/DynamicPartitionPruningOptimization.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/DynamicPartitionPruningOptimization.java @@ -65,7 +65,6 @@ import org.apache.hadoop.hive.ql.plan.GroupByDesc; import org.apache.hadoop.hive.ql.plan.OperatorDesc; import org.apache.hadoop.hive.ql.plan.PlanUtils; import org.apache.hadoop.hive.ql.plan.SelectDesc; -import org.apache.hadoop.hive.ql.plan.TableScanDesc; /** * This optimization looks for expressions of the kind "x IN (RS[n])". If such @@ -166,7 +165,8 @@ public class DynamicPartitionPruningOptimization implements NodeProcessor { procCtx.getClass().getName()); } - final FilterOperator filter = (FilterOperator) nd; + FilterOperator filter = (FilterOperator) nd; + FilterDesc desc = filter.getConf(); TableScanOperator ts = null; @@ -183,19 +183,15 @@ public class DynamicPartitionPruningOptimization implements NodeProcessor { ts = (TableScanOperator) filter.getParentOperators().get(0); } - final ExprNodeDesc filterPredicate = filter.getConf().getPredicate(), - tsPredicate = ts != null ? ts.getConf().getFilterExpr() : null, - predicateToUse = (tsPredicate == null) ? filterPredicate : tsPredicate; - if (LOG.isDebugEnabled()) { LOG.debug("Parent: " + filter.getParentOperators().get(0)); - LOG.debug("Filter: " + predicateToUse.getExprString()); + LOG.debug("Filter: " + desc.getPredicateString()); LOG.debug("TableScan: " + ts); } // collect the dynamic pruning conditions removerContext.dynLists.clear(); - walkExprTree(predicateToUse, removerContext); + walkExprTree(desc.getPredicate(), removerContext); for (DynamicListContext ctx : removerContext) { String column = extractColName(ctx.parent); @@ -228,53 +224,50 @@ public class DynamicPartitionPruningOptimization implements NodeProcessor { } // we always remove the condition by replacing it with "true" - if (predicateToUse == filterPredicate) { - removeDppExpr(filter.getConf(), ctx); + ExprNodeDesc constNode = new ExprNodeConstantDesc(ctx.parent.getTypeInfo(), true); + if (ctx.grandParent == null) { + desc.setPredicate(constNode); } else { - removeDppExpr(ts.getConf(), ctx); + int i = ctx.grandParent.getChildren().indexOf(ctx.parent); + ctx.grandParent.getChildren().remove(i); + ctx.grandParent.getChildren().add(i, constNode); } } - // Clean up the other predicate too. - if (predicateToUse == tsPredicate) { - removerContext = new DynamicPartitionPrunerContext(); - removerContext.dynLists.clear(); - walkExprTree(filterPredicate, removerContext); - for (DynamicListContext ctx : removerContext) { - removeDppExpr(filter.getConf(), ctx); - } - } + // if we pushed the predicate into the table scan we need to remove the + // synthetic conditions there. + cleanTableScanFilters(ts); return false; } + private void cleanTableScanFilters(TableScanOperator ts) throws SemanticException { - private void removeDppExpr(final FilterDesc desc, DynamicListContext ctx) { - ExprNodeDesc constNode = new ExprNodeConstantDesc(ctx.parent.getTypeInfo(), true); - if (ctx.grandParent == null) { - desc.setPredicate(constNode); - } else { - int i = ctx.grandParent.getChildren().indexOf(ctx.parent); - ctx.grandParent.getChildren().remove(i); - ctx.grandParent.getChildren().add(i, constNode); + if (ts == null || ts.getConf() == null || ts.getConf().getFilterExpr() == null) { + // nothing to do + return; } - } - private void removeDppExpr(TableScanDesc conf, DynamicListContext ctx) { + DynamicPartitionPrunerContext removerContext = new DynamicPartitionPrunerContext(); - ExprNodeDesc constNode = new ExprNodeConstantDesc(ctx.parent.getTypeInfo(), true); - if (ctx.grandParent == null) { - // we're the only node, just clear out the expression - conf.setFilterExpr(null); - } else { - int i = ctx.grandParent.getChildren().indexOf(ctx.parent); - ctx.grandParent.getChildren().remove(i); - ctx.grandParent.getChildren().add(i, constNode); + // collect the dynamic pruning conditions + removerContext.dynLists.clear(); + walkExprTree(ts.getConf().getFilterExpr(), removerContext); + + for (DynamicListContext ctx : removerContext) { + // remove the condition by replacing it with "true" + ExprNodeDesc constNode = new ExprNodeConstantDesc(ctx.parent.getTypeInfo(), true); + if (ctx.grandParent == null) { + // we're the only node, just clear out the expression + ts.getConf().setFilterExpr(null); + } else { + int i = ctx.grandParent.getChildren().indexOf(ctx.parent); + ctx.grandParent.getChildren().remove(i); + ctx.grandParent.getChildren().add(i, constNode); + } } } - - private void generateEventOperatorPlan(DynamicListContext ctx, ParseContext parseContext, TableScanOperator ts, String column) { http://git-wip-us.apache.org/repos/asf/hive/blob/25c207c9/ql/src/java/org/apache/hadoop/hive/ql/optimizer/pcr/PcrExprProcFactory.java ---------------------------------------------------------------------- diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/pcr/PcrExprProcFactory.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/pcr/PcrExprProcFactory.java index 2ab1575..9cc9ea9 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/pcr/PcrExprProcFactory.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/pcr/PcrExprProcFactory.java @@ -46,6 +46,7 @@ import org.apache.hadoop.hive.ql.parse.SemanticException; import org.apache.hadoop.hive.ql.plan.ExprNodeColumnDesc; import org.apache.hadoop.hive.ql.plan.ExprNodeConstantDesc; import org.apache.hadoop.hive.ql.plan.ExprNodeDesc; +import org.apache.hadoop.hive.ql.plan.ExprNodeDynamicListDesc; import org.apache.hadoop.hive.ql.plan.ExprNodeFieldDesc; import org.apache.hadoop.hive.ql.plan.ExprNodeGenericFuncDesc; import org.apache.hadoop.hive.ql.udf.generic.GenericUDFIn; @@ -377,17 +378,31 @@ public final class PcrExprProcFactory { if (FunctionRegistry.isDeterministic(((ExprNodeGenericFuncDesc) lhs) .getGenericUDF())) { boolean hasOnlyPartCols = true; + boolean hasDynamicListDesc = false; + for (ExprNodeDesc ed : ((ExprNodeGenericFuncDesc) lhs).getChildren()) { - // Check if the current field expression contains only - // partition column or a virtual column or constants. - // If yes, this filter predicate is a candidate for this optimization. - if (!(ed instanceof ExprNodeColumnDesc && - ((ExprNodeColumnDesc)ed).getIsPartitionColOrVirtualCol())) { - hasOnlyPartCols = false; + // Check if the current field expression contains only + // partition column or a virtual column or constants. + // If yes, this filter predicate is a candidate for this optimization. + if (!(ed instanceof ExprNodeColumnDesc && + ((ExprNodeColumnDesc)ed).getIsPartitionColOrVirtualCol())) { + hasOnlyPartCols = false; + break; + } + } + + // If we have non-partition columns, we cannot remove the predicate. + if (hasOnlyPartCols) { + // We should not remove the dynamic partition pruner generated synthetic predicates. + for (int i = 1; i < children.size(); i++) { + if (children.get(i) instanceof ExprNodeDynamicListDesc) { + hasDynamicListDesc = true; break; } - } - removePredElem = hasOnlyPartCols; + } + } + + removePredElem = hasOnlyPartCols && !hasDynamicListDesc; } } http://git-wip-us.apache.org/repos/asf/hive/blob/25c207c9/ql/src/test/results/clientpositive/llap/dynamic_partition_pruning.q.out ---------------------------------------------------------------------- diff --git a/ql/src/test/results/clientpositive/llap/dynamic_partition_pruning.q.out b/ql/src/test/results/clientpositive/llap/dynamic_partition_pruning.q.out index 17d527b..c6dc55c 100644 --- a/ql/src/test/results/clientpositive/llap/dynamic_partition_pruning.q.out +++ b/ql/src/test/results/clientpositive/llap/dynamic_partition_pruning.q.out @@ -1322,7 +1322,7 @@ STAGE PLANS: Map Operator Tree: TableScan alias: srcpart - filterExpr: (hr is not null and UDFToDouble(hr) is not null) (type: boolean) + filterExpr: UDFToDouble(hr) is not null (type: boolean) Statistics: Num rows: 2000 Data size: 21248 Basic stats: COMPLETE Column stats: NONE Filter Operator predicate: UDFToDouble(hr) is not null (type: boolean) @@ -2521,7 +2521,6 @@ STAGE PLANS: Map Operator Tree: TableScan alias: srcpart - filterExpr: (ds) IN (RS[5]) (type: boolean) Statistics: Num rows: 2000 Data size: 21248 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: ds (type: string) @@ -2596,7 +2595,6 @@ STAGE PLANS: Map Operator Tree: TableScan alias: srcpart - filterExpr: (ds) IN (RS[6]) (type: boolean) Statistics: Num rows: 2000 Data size: 21248 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: ds (type: string) @@ -2708,7 +2706,6 @@ STAGE PLANS: Map Operator Tree: TableScan alias: srcpart - filterExpr: (ds) IN (RS[12]) (type: boolean) Statistics: Num rows: 1000 Data size: 10624 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: ds (type: string) @@ -4272,7 +4269,7 @@ STAGE PLANS: Map Operator Tree: TableScan alias: srcpart - filterExpr: (hr is not null and UDFToDouble(hr) is not null) (type: boolean) + filterExpr: UDFToDouble(hr) is not null (type: boolean) Statistics: Num rows: 2000 Data size: 21248 Basic stats: COMPLETE Column stats: NONE Filter Operator predicate: UDFToDouble(hr) is not null (type: boolean) @@ -4804,7 +4801,6 @@ STAGE PLANS: Map Operator Tree: TableScan alias: srcpart - filterExpr: (ds) IN (RS[5]) (type: boolean) Statistics: Num rows: 2000 Data size: 21248 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: ds (type: string) @@ -4860,7 +4856,6 @@ STAGE PLANS: Map Operator Tree: TableScan alias: srcpart - filterExpr: (ds) IN (RS[6]) (type: boolean) Statistics: Num rows: 2000 Data size: 21248 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: ds (type: string) @@ -4951,7 +4946,6 @@ STAGE PLANS: Map Operator Tree: TableScan alias: srcpart - filterExpr: (ds) IN (RS[12]) (type: boolean) Statistics: Num rows: 1000 Data size: 10624 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: ds (type: string) http://git-wip-us.apache.org/repos/asf/hive/blob/25c207c9/ql/src/test/results/clientpositive/llap/vectorized_dynamic_partition_pruning.q.out ---------------------------------------------------------------------- diff --git a/ql/src/test/results/clientpositive/llap/vectorized_dynamic_partition_pruning.q.out b/ql/src/test/results/clientpositive/llap/vectorized_dynamic_partition_pruning.q.out index 5fbc4f6..5ceefe1 100644 --- a/ql/src/test/results/clientpositive/llap/vectorized_dynamic_partition_pruning.q.out +++ b/ql/src/test/results/clientpositive/llap/vectorized_dynamic_partition_pruning.q.out @@ -1322,7 +1322,7 @@ STAGE PLANS: Map Operator Tree: TableScan alias: srcpart - filterExpr: (hr is not null and UDFToDouble(hr) is not null) (type: boolean) + filterExpr: UDFToDouble(hr) is not null (type: boolean) Statistics: Num rows: 2000 Data size: 21248 Basic stats: COMPLETE Column stats: NONE Filter Operator predicate: UDFToDouble(hr) is not null (type: boolean) @@ -2521,7 +2521,6 @@ STAGE PLANS: Map Operator Tree: TableScan alias: srcpart - filterExpr: (ds) IN (RS[5]) (type: boolean) Statistics: Num rows: 2000 Data size: 21248 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: ds (type: string) @@ -2596,7 +2595,6 @@ STAGE PLANS: Map Operator Tree: TableScan alias: srcpart - filterExpr: (ds) IN (RS[6]) (type: boolean) Statistics: Num rows: 2000 Data size: 21248 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: ds (type: string) @@ -2708,7 +2706,6 @@ STAGE PLANS: Map Operator Tree: TableScan alias: srcpart - filterExpr: (ds) IN (RS[12]) (type: boolean) Statistics: Num rows: 1000 Data size: 10624 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: ds (type: string) @@ -4272,7 +4269,7 @@ STAGE PLANS: Map Operator Tree: TableScan alias: srcpart - filterExpr: (hr is not null and UDFToDouble(hr) is not null) (type: boolean) + filterExpr: UDFToDouble(hr) is not null (type: boolean) Statistics: Num rows: 2000 Data size: 21248 Basic stats: COMPLETE Column stats: NONE Filter Operator predicate: UDFToDouble(hr) is not null (type: boolean) @@ -4804,7 +4801,6 @@ STAGE PLANS: Map Operator Tree: TableScan alias: srcpart - filterExpr: (ds) IN (RS[5]) (type: boolean) Statistics: Num rows: 2000 Data size: 21248 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: ds (type: string) @@ -4860,7 +4856,6 @@ STAGE PLANS: Map Operator Tree: TableScan alias: srcpart - filterExpr: (ds) IN (RS[6]) (type: boolean) Statistics: Num rows: 2000 Data size: 21248 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: ds (type: string) @@ -4951,7 +4946,6 @@ STAGE PLANS: Map Operator Tree: TableScan alias: srcpart - filterExpr: (ds) IN (RS[12]) (type: boolean) Statistics: Num rows: 1000 Data size: 10624 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: ds (type: string) http://git-wip-us.apache.org/repos/asf/hive/blob/25c207c9/ql/src/test/results/clientpositive/tez/dynamic_partition_pruning.q.out ---------------------------------------------------------------------- diff --git a/ql/src/test/results/clientpositive/tez/dynamic_partition_pruning.q.out b/ql/src/test/results/clientpositive/tez/dynamic_partition_pruning.q.out index b4d19ee..d4b670d 100644 --- a/ql/src/test/results/clientpositive/tez/dynamic_partition_pruning.q.out +++ b/ql/src/test/results/clientpositive/tez/dynamic_partition_pruning.q.out @@ -1284,7 +1284,7 @@ STAGE PLANS: Map Operator Tree: TableScan alias: srcpart - filterExpr: (hr is not null and UDFToDouble(hr) is not null) (type: boolean) + filterExpr: UDFToDouble(hr) is not null (type: boolean) Statistics: Num rows: 2000 Data size: 21248 Basic stats: COMPLETE Column stats: NONE Filter Operator predicate: UDFToDouble(hr) is not null (type: boolean) @@ -2445,7 +2445,6 @@ STAGE PLANS: Map Operator Tree: TableScan alias: srcpart - filterExpr: (ds) IN (RS[5]) (type: boolean) Statistics: Num rows: 2000 Data size: 21248 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: ds (type: string) @@ -2517,7 +2516,6 @@ STAGE PLANS: Map Operator Tree: TableScan alias: srcpart - filterExpr: (ds) IN (RS[6]) (type: boolean) Statistics: Num rows: 2000 Data size: 21248 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: ds (type: string) @@ -2625,7 +2623,6 @@ STAGE PLANS: Map Operator Tree: TableScan alias: srcpart - filterExpr: (ds) IN (RS[12]) (type: boolean) Statistics: Num rows: 1000 Data size: 10624 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: ds (type: string) @@ -4141,7 +4138,7 @@ STAGE PLANS: Map Operator Tree: TableScan alias: srcpart - filterExpr: (hr is not null and UDFToDouble(hr) is not null) (type: boolean) + filterExpr: UDFToDouble(hr) is not null (type: boolean) Statistics: Num rows: 2000 Data size: 21248 Basic stats: COMPLETE Column stats: NONE Filter Operator predicate: UDFToDouble(hr) is not null (type: boolean) @@ -4659,7 +4656,6 @@ STAGE PLANS: Map Operator Tree: TableScan alias: srcpart - filterExpr: (ds) IN (RS[5]) (type: boolean) Statistics: Num rows: 2000 Data size: 21248 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: ds (type: string) @@ -4713,7 +4709,6 @@ STAGE PLANS: Map Operator Tree: TableScan alias: srcpart - filterExpr: (ds) IN (RS[6]) (type: boolean) Statistics: Num rows: 2000 Data size: 21248 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: ds (type: string) @@ -4801,7 +4796,6 @@ STAGE PLANS: Map Operator Tree: TableScan alias: srcpart - filterExpr: (ds) IN (RS[12]) (type: boolean) Statistics: Num rows: 1000 Data size: 10624 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: ds (type: string) http://git-wip-us.apache.org/repos/asf/hive/blob/25c207c9/ql/src/test/results/clientpositive/tez/mergejoin.q.out ---------------------------------------------------------------------- diff --git a/ql/src/test/results/clientpositive/tez/mergejoin.q.out b/ql/src/test/results/clientpositive/tez/mergejoin.q.out index b2b3872..15c204d 100644 --- a/ql/src/test/results/clientpositive/tez/mergejoin.q.out +++ b/ql/src/test/results/clientpositive/tez/mergejoin.q.out @@ -1363,7 +1363,6 @@ STAGE PLANS: Map Operator Tree: TableScan alias: b - filterExpr: (key) IN (RS[4]) (type: boolean) Statistics: Num rows: 500 Data size: 47000 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: key (type: int) @@ -1456,7 +1455,6 @@ STAGE PLANS: Map Operator Tree: TableScan alias: a - filterExpr: (key) IN (RS[5]) (type: boolean) Statistics: Num rows: 242 Data size: 22748 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: key (type: int) http://git-wip-us.apache.org/repos/asf/hive/blob/25c207c9/ql/src/test/results/clientpositive/tez/vectorized_dynamic_partition_pruning.q.out ---------------------------------------------------------------------- diff --git a/ql/src/test/results/clientpositive/tez/vectorized_dynamic_partition_pruning.q.out b/ql/src/test/results/clientpositive/tez/vectorized_dynamic_partition_pruning.q.out index 2ec632a..4f6cb91 100644 --- a/ql/src/test/results/clientpositive/tez/vectorized_dynamic_partition_pruning.q.out +++ b/ql/src/test/results/clientpositive/tez/vectorized_dynamic_partition_pruning.q.out @@ -1303,7 +1303,7 @@ STAGE PLANS: Map Operator Tree: TableScan alias: srcpart - filterExpr: (hr is not null and UDFToDouble(hr) is not null) (type: boolean) + filterExpr: UDFToDouble(hr) is not null (type: boolean) Statistics: Num rows: 2000 Data size: 21248 Basic stats: COMPLETE Column stats: NONE Filter Operator predicate: UDFToDouble(hr) is not null (type: boolean) @@ -2483,7 +2483,6 @@ STAGE PLANS: Map Operator Tree: TableScan alias: srcpart - filterExpr: (ds) IN (RS[5]) (type: boolean) Statistics: Num rows: 2000 Data size: 21248 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: ds (type: string) @@ -2556,7 +2555,6 @@ STAGE PLANS: Map Operator Tree: TableScan alias: srcpart - filterExpr: (ds) IN (RS[6]) (type: boolean) Statistics: Num rows: 2000 Data size: 21248 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: ds (type: string) @@ -2666,7 +2664,6 @@ STAGE PLANS: Map Operator Tree: TableScan alias: srcpart - filterExpr: (ds) IN (RS[12]) (type: boolean) Statistics: Num rows: 1000 Data size: 10624 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: ds (type: string) @@ -4208,7 +4205,7 @@ STAGE PLANS: Map Operator Tree: TableScan alias: srcpart - filterExpr: (hr is not null and UDFToDouble(hr) is not null) (type: boolean) + filterExpr: UDFToDouble(hr) is not null (type: boolean) Statistics: Num rows: 2000 Data size: 21248 Basic stats: COMPLETE Column stats: NONE Filter Operator predicate: UDFToDouble(hr) is not null (type: boolean) @@ -4735,7 +4732,6 @@ STAGE PLANS: Map Operator Tree: TableScan alias: srcpart - filterExpr: (ds) IN (RS[5]) (type: boolean) Statistics: Num rows: 2000 Data size: 21248 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: ds (type: string) @@ -4790,7 +4786,6 @@ STAGE PLANS: Map Operator Tree: TableScan alias: srcpart - filterExpr: (ds) IN (RS[6]) (type: boolean) Statistics: Num rows: 2000 Data size: 21248 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: ds (type: string) @@ -4880,7 +4875,6 @@ STAGE PLANS: Map Operator Tree: TableScan alias: srcpart - filterExpr: (ds) IN (RS[12]) (type: boolean) Statistics: Num rows: 1000 Data size: 10624 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: ds (type: string)