You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by na...@apache.org on 2012/12/06 18:47:12 UTC

svn commit: r1418012 - in /hive/trunk: common/src/java/org/apache/hadoop/hive/conf/ ql/src/java/org/apache/hadoop/hive/ql/exec/ ql/src/java/org/apache/hadoop/hive/ql/parse/ ql/src/java/org/apache/hadoop/hive/ql/plan/ ql/src/test/queries/clientpositive/...

Author: namit
Date: Thu Dec  6 17:47:11 2012
New Revision: 1418012

URL: http://svn.apache.org/viewvc?rev=1418012&view=rev
Log:
HIVE-2477 Use name of original expression for name of CAST output
(Navis via namit)


Added:
    hive/trunk/ql/src/test/queries/clientpositive/alias_casted_column.q
    hive/trunk/ql/src/test/results/clientpositive/alias_casted_column.q.out
Modified:
    hive/trunk/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/ExprNodeDescUtils.java

Modified: hive/trunk/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java
URL: http://svn.apache.org/viewvc/hive/trunk/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java?rev=1418012&r1=1418011&r2=1418012&view=diff
==============================================================================
--- hive/trunk/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java (original)
+++ hive/trunk/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java Thu Dec  6 17:47:11 2012
@@ -631,7 +631,7 @@ public class HiveConf extends Configurat
     HIVE_CONCATENATE_CHECK_INDEX ("hive.exec.concatenate.check.index", true),
     HIVE_IO_EXCEPTION_HANDLERS("hive.io.exception.handlers", ""),
 
-    //prefix used to auto generated column aliases
+    // prefix used to auto generated column aliases (this should be started with '_')
     HIVE_AUTOGEN_COLUMNALIAS_PREFIX_LABEL("hive.autogen.columnalias.prefix.label", "_c"),
     HIVE_AUTOGEN_COLUMNALIAS_PREFIX_INCLUDEFUNCNAME(
                                "hive.autogen.columnalias.prefix.includefuncname", false),

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java?rev=1418012&r1=1418011&r2=1418012&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java Thu Dec  6 17:47:11 2012
@@ -1180,6 +1180,34 @@ public final class FunctionRegistry {
   }
 
   /**
+   * Returns whether the exprNodeDesc is node of "cast".
+   */
+  private static boolean isOpCast(ExprNodeDesc desc) {
+    if (!(desc instanceof ExprNodeGenericFuncDesc)) {
+      return false;
+    }
+    GenericUDF genericUDF = ((ExprNodeGenericFuncDesc)desc).getGenericUDF();
+    Class udfClass;
+    if (genericUDF instanceof GenericUDFBridge) {
+      udfClass = ((GenericUDFBridge)genericUDF).getUdfClass();
+    } else {
+      udfClass = genericUDF.getClass();
+    }
+    return udfClass == UDFToBoolean.class || udfClass == UDFToByte.class ||
+        udfClass == UDFToDouble.class || udfClass == UDFToFloat.class ||
+        udfClass == UDFToInteger.class || udfClass == UDFToLong.class ||
+        udfClass == UDFToShort.class || udfClass == UDFToString.class ||
+        udfClass == GenericUDFTimestamp.class || udfClass == GenericUDFToBinary.class;
+  }
+
+  /**
+   * Returns whether the exprNodeDesc can recommend name for the expression
+   */
+  public static boolean isOpPreserveInputName(ExprNodeDesc desc) {
+    return isOpCast(desc);
+  }
+
+  /**
    * Registers the appropriate kind of temporary function based on a class's
    * type.
    *

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java?rev=1418012&r1=1418011&r2=1418012&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java Thu Dec  6 17:47:11 2012
@@ -126,6 +126,7 @@ import org.apache.hadoop.hive.ql.plan.Dy
 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.ExprNodeDescUtils;
 import org.apache.hadoop.hive.ql.plan.ExprNodeGenericFuncDesc;
 import org.apache.hadoop.hive.ql.plan.ExprNodeNullDesc;
 import org.apache.hadoop.hive.ql.plan.ExtractDesc;
@@ -2413,6 +2414,10 @@ public class SemanticAnalyzer extends Ba
         // We allow stateful functions in the SELECT list (but nowhere else)
         tcCtx.setAllowStatefulFunctions(true);
         ExprNodeDesc exp = genExprNodeDesc(expr, inputRR, tcCtx);
+        String recommended = recommendName(exp, colAlias);
+        if (recommended != null && out_rwsch.get(null, recommended) == null) {
+          colAlias = recommended;
+        }
         col_list.add(exp);
         if (subQuery) {
           out_rwsch.checkColumn(tabAlias, colAlias);
@@ -2461,6 +2466,17 @@ public class SemanticAnalyzer extends Ba
     return output;
   }
 
+  private String recommendName(ExprNodeDesc exp, String colAlias) {
+    if (!colAlias.startsWith(autogenColAliasPrfxLbl)) {
+      return null;
+    }
+    String column = ExprNodeDescUtils.recommendInputName(exp);
+    if (column != null && !column.startsWith(autogenColAliasPrfxLbl)) {
+      return column;
+    }
+    return null;
+  }
+
   /**
    * Class to store GenericUDAF related information.
    */

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/ExprNodeDescUtils.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/ExprNodeDescUtils.java?rev=1418012&r1=1418011&r2=1418012&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/ExprNodeDescUtils.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/ExprNodeDescUtils.java Thu Dec  6 17:47:11 2012
@@ -98,4 +98,19 @@ public class ExprNodeDescUtils {
     return new ExprNodeGenericFuncDesc(TypeInfoFactory.booleanTypeInfo,
         FunctionRegistry.getGenericUDFForAnd(), children);
   }
+
+  /**
+   * Recommend name for the expression
+   */
+  public static String recommendInputName(ExprNodeDesc desc) {
+    if (desc instanceof ExprNodeColumnDesc) {
+      return ((ExprNodeColumnDesc)desc).getColumn();
+    }
+    List<ExprNodeDesc> children = desc.getChildren();
+    if (FunctionRegistry.isOpPreserveInputName(desc) && !children.isEmpty() &&
+      children.get(0) instanceof ExprNodeColumnDesc) {
+      return ((ExprNodeColumnDesc)children.get(0)).getColumn();
+    }
+    return null;
+  }
 }

Added: hive/trunk/ql/src/test/queries/clientpositive/alias_casted_column.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientpositive/alias_casted_column.q?rev=1418012&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientpositive/alias_casted_column.q (added)
+++ hive/trunk/ql/src/test/queries/clientpositive/alias_casted_column.q Thu Dec  6 17:47:11 2012
@@ -0,0 +1,5 @@
+-- HIVE-2477 Use name of original expression for name of CAST output
+explain select key from (select cast(key as int) from src )t;
+
+--backward
+explain select key2 from (select cast(key as int) key2 from src )t;

Added: hive/trunk/ql/src/test/results/clientpositive/alias_casted_column.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientpositive/alias_casted_column.q.out?rev=1418012&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientpositive/alias_casted_column.q.out (added)
+++ hive/trunk/ql/src/test/results/clientpositive/alias_casted_column.q.out Thu Dec  6 17:47:11 2012
@@ -0,0 +1,84 @@
+PREHOOK: query: -- HIVE-2477 Use name of original expression for name of CAST output
+explain select key from (select cast(key as int) from src )t
+PREHOOK: type: QUERY
+POSTHOOK: query: -- HIVE-2477 Use name of original expression for name of CAST output
+explain select key from (select cast(key as int) from src )t
+POSTHOOK: type: QUERY
+ABSTRACT SYNTAX TREE:
+  (TOK_QUERY (TOK_FROM (TOK_SUBQUERY (TOK_QUERY (TOK_FROM (TOK_TABREF (TOK_TABNAME src))) (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_SELEXPR (TOK_FUNCTION TOK_INT (TOK_TABLE_OR_COL key)))))) t)) (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_SELEXPR (TOK_TABLE_OR_COL key)))))
+
+STAGE DEPENDENCIES:
+  Stage-1 is a root stage
+  Stage-0 is a root stage
+
+STAGE PLANS:
+  Stage: Stage-1
+    Map Reduce
+      Alias -> Map Operator Tree:
+        t:src 
+          TableScan
+            alias: src
+            Select Operator
+              expressions:
+                    expr: UDFToInteger(key)
+                    type: int
+              outputColumnNames: _col0
+              Select Operator
+                expressions:
+                      expr: _col0
+                      type: int
+                outputColumnNames: _col0
+                File Output Operator
+                  compressed: false
+                  GlobalTableId: 0
+                  table:
+                      input format: org.apache.hadoop.mapred.TextInputFormat
+                      output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+
+  Stage: Stage-0
+    Fetch Operator
+      limit: -1
+
+
+PREHOOK: query: --backward
+explain select key2 from (select cast(key as int) key2 from src )t
+PREHOOK: type: QUERY
+POSTHOOK: query: --backward
+explain select key2 from (select cast(key as int) key2 from src )t
+POSTHOOK: type: QUERY
+ABSTRACT SYNTAX TREE:
+  (TOK_QUERY (TOK_FROM (TOK_SUBQUERY (TOK_QUERY (TOK_FROM (TOK_TABREF (TOK_TABNAME src))) (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_SELEXPR (TOK_FUNCTION TOK_INT (TOK_TABLE_OR_COL key)) key2)))) t)) (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_SELEXPR (TOK_TABLE_OR_COL key2)))))
+
+STAGE DEPENDENCIES:
+  Stage-1 is a root stage
+  Stage-0 is a root stage
+
+STAGE PLANS:
+  Stage: Stage-1
+    Map Reduce
+      Alias -> Map Operator Tree:
+        t:src 
+          TableScan
+            alias: src
+            Select Operator
+              expressions:
+                    expr: UDFToInteger(key)
+                    type: int
+              outputColumnNames: _col0
+              Select Operator
+                expressions:
+                      expr: _col0
+                      type: int
+                outputColumnNames: _col0
+                File Output Operator
+                  compressed: false
+                  GlobalTableId: 0
+                  table:
+                      input format: org.apache.hadoop.mapred.TextInputFormat
+                      output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+
+  Stage: Stage-0
+    Fetch Operator
+      limit: -1
+
+