diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/ExplainTask.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/ExplainTask.java index d7d33c6f25..aa4d492fe0 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/ExplainTask.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/ExplainTask.java @@ -921,7 +921,7 @@ JSONObject outputPlan(Object work, PrintStream out, // Try the output as a primitive object if (isPrintable(val)) { - if (out != null && shouldPrint(xpl_note, val)) { + if (out != null && shouldPrint(xpl_note, val) && xpl_note.jsonOnly() == false) { if (!skipHeader) { out.print(header); out.print(" "); @@ -948,7 +948,7 @@ JSONObject outputPlan(Object work, PrintStream out, // Go through the map and print out the stuff Map mp = (Map) val; - if (out != null && !skipHeader && mp != null && !mp.isEmpty()) { + if (out != null && !skipHeader && mp != null && !mp.isEmpty() && xpl_note.jsonOnly()==false) { out.print(header); } @@ -962,7 +962,7 @@ JSONObject outputPlan(Object work, PrintStream out, // Try this as a list if (val instanceof List || val instanceof Set) { List l = val instanceof List ? (List)val : new ArrayList((Set)val); - if (out != null && !skipHeader && l != null && !l.isEmpty()) { + if (out != null && !skipHeader && l != null && !l.isEmpty() && xpl_note.jsonOnly()==false) { out.print(header); } @@ -977,7 +977,7 @@ JSONObject outputPlan(Object work, PrintStream out, // Finally check if it is serializable try { - if (!skipHeader && out != null) { + if (!skipHeader && out != null && xpl_note.jsonOnly()==false) { out.println(header); } JSONObject jsonOut = outputPlan(val, out, extended, jsonOutput, ind); diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/Operator.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/Operator.java index 885c20379f..8baf85722e 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/Operator.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/Operator.java @@ -1024,6 +1024,7 @@ static public String getOperatorName() { * * @return null if the operator doesn't change columns */ + @Explain(displayName = "colExpressionMap") public Map getColumnExprMap() { return colExprMap; } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/plan/Explain.java b/ql/src/java/org/apache/hadoop/hive/ql/plan/Explain.java index fbda0eada3..81b0e82dc1 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/plan/Explain.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/plan/Explain.java @@ -46,6 +46,8 @@ public boolean in(Level[] levels) { boolean skipHeader() default false; + boolean jsonOnly() default false; + // By default, many existing @Explain classes/methods are NON_VECTORIZED. // // Vectorized methods/classes have detail levels: diff --git a/ql/src/java/org/apache/hadoop/hive/ql/plan/TableScanDesc.java b/ql/src/java/org/apache/hadoop/hive/ql/plan/TableScanDesc.java index 237c8cfda1..a1d0705933 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/plan/TableScanDesc.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/plan/TableScanDesc.java @@ -152,6 +152,16 @@ public String getAlias() { return alias; } + @Explain(displayName = "name", jsonOnly = true) + public String getTableName() { + return this.tableMetadata.getTableName(); + } + + @Explain(displayName = "database", jsonOnly = true) + public String getDatabaseName() { + return this.tableMetadata.getDbName(); + } + @Explain(explainLevels = { Level.USER }) public String getTbl() { StringBuilder sb = new StringBuilder(); @@ -180,6 +190,16 @@ public boolean isAcidTable() { return this.neededColumns; } + @Explain(displayName = "columnsScanned", jsonOnly = true) + public List getColumnNamesForExplain() { + return this.neededColumns; + } + + @Explain(displayName = "isTemp", jsonOnly = true) + public boolean isTemporary() { + return tableMetadata.isTemporary(); + } + @Explain(displayName = "filterExpr") public String getFilterExprString() { if (filterExpr == null) {