You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by jv...@apache.org on 2011/10/18 09:22:40 UTC

svn commit: r1185511 - in /hive/trunk/ql/src/java/org/apache/hadoop/hive/ql: exec/ optimizer/index/ parse/ udf/generic/

Author: jvs
Date: Tue Oct 18 07:22:39 2011
New Revision: 1185511

URL: http://svn.apache.org/viewvc?rev=1185511&view=rev
Log:
HIVE-2506. Get ConstantObjectInspectors working in UDAFs
(Jonathan Chang via jvs)


Modified:
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/index/RewriteQueryUsingAggregateIndex.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/AbstractGenericUDAFResolver.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFParameterInfo.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFPercentileApprox.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/SimpleGenericUDAFParameterInfo.java

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=1185511&r1=1185510&r2=1185511&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 Tue Oct 18 07:22:39 2011
@@ -202,6 +202,7 @@ import org.apache.hadoop.hive.ql.udf.xml
 import org.apache.hadoop.hive.ql.udf.xml.UDFXPathShort;
 import org.apache.hadoop.hive.ql.udf.xml.UDFXPathString;
 import org.apache.hadoop.hive.serde.Constants;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
 import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector.Category;
 import org.apache.hadoop.hive.serde2.typeinfo.ListTypeInfo;
 import org.apache.hadoop.hive.serde2.typeinfo.MapTypeInfo;
@@ -695,7 +696,7 @@ public final class FunctionRegistry {
    */
   @SuppressWarnings("deprecation")
   public static GenericUDAFEvaluator getGenericUDAFEvaluator(String name,
-      List<TypeInfo> argumentTypeInfos, boolean isDistinct,
+      List<ObjectInspector> argumentOIs, boolean isDistinct,
       boolean isAllColumns) throws SemanticException {
 
     GenericUDAFResolver udafResolver = getGenericUDAFResolver(name);
@@ -703,20 +704,22 @@ public final class FunctionRegistry {
       return null;
     }
 
-    TypeInfo[] parameters = new TypeInfo[argumentTypeInfos.size()];
-    for (int i = 0; i < parameters.length; i++) {
-      parameters[i] = argumentTypeInfos.get(i);
+    GenericUDAFEvaluator udafEvaluator = null;
+    ObjectInspector args[] = new ObjectInspector[argumentOIs.size()];
+    // Can't use toArray here because Java is dumb when it comes to 
+    // generics + arrays.
+    for (int ii = 0; ii < argumentOIs.size(); ++ii) {
+      args[ii] = argumentOIs.get(ii);
     }
 
-    GenericUDAFEvaluator udafEvaluator = null;
+    GenericUDAFParameterInfo paramInfo =
+        new SimpleGenericUDAFParameterInfo(
+            args, isDistinct, isAllColumns);
     if (udafResolver instanceof GenericUDAFResolver2) {
-      GenericUDAFParameterInfo paramInfo =
-          new SimpleGenericUDAFParameterInfo(
-              parameters, isDistinct, isAllColumns);
       udafEvaluator =
           ((GenericUDAFResolver2) udafResolver).getEvaluator(paramInfo);
     } else {
-      udafEvaluator = udafResolver.getEvaluator(parameters);
+      udafEvaluator = udafResolver.getEvaluator(paramInfo.getParameters());
     }
     return udafEvaluator;
   }

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/index/RewriteQueryUsingAggregateIndex.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/index/RewriteQueryUsingAggregateIndex.java?rev=1185511&r1=1185510&r2=1185511&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/index/RewriteQueryUsingAggregateIndex.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/index/RewriteQueryUsingAggregateIndex.java Tue Oct 18 07:22:39 2011
@@ -54,6 +54,7 @@ import org.apache.hadoop.hive.ql.plan.Gr
 import org.apache.hadoop.hive.ql.plan.TableScanDesc;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDAFEvaluator;
 import org.apache.hadoop.hive.serde2.SerDeException;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
 import org.apache.hadoop.hive.serde2.objectinspector.StructField;
 import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
 import org.apache.hadoop.hive.serde2.typeinfo.PrimitiveTypeInfo;
@@ -299,12 +300,12 @@ public final class RewriteQueryUsingAggr
         if(childAggrList != null && childAggrList.size() > 0){
           for (AggregationDesc aggregationDesc : childAggrList) {
             List<ExprNodeDesc> paraList = aggregationDesc.getParameters();
-            List<TypeInfo> parametersTypeInfoList = new ArrayList<TypeInfo>();
+            List<ObjectInspector> parametersOIList = new ArrayList<ObjectInspector>();
             for (ExprNodeDesc expr : paraList) {
-              parametersTypeInfoList.add(expr.getTypeInfo());
+              parametersOIList.add(expr.getWritableObjectInspector());
             }
             GenericUDAFEvaluator evaluator = FunctionRegistry.getGenericUDAFEvaluator(
-                "sum", parametersTypeInfoList, false, false);
+                "sum", parametersOIList, false, false);
             aggregationDesc.setGenericUDAFEvaluator(evaluator);
             aggregationDesc.setGenericUDAFName("sum");
           }

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=1185511&r1=1185510&r2=1185511&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 Tue Oct 18 07:22:39 2011
@@ -2309,6 +2309,17 @@ public class SemanticAnalyzer extends Ba
   }
 
   /**
+   * Convert exprNodeDesc array to ObjectInspector array.
+   */
+  static ArrayList<ObjectInspector> getWritableObjectInspector(ArrayList<ExprNodeDesc> exprs) {
+    ArrayList<ObjectInspector> result = new ArrayList<ObjectInspector>();
+    for (ExprNodeDesc expr : exprs) {
+      result.add(expr.getWritableObjectInspector());
+    }
+    return result;
+  }
+
+  /**
    * Convert exprNodeDesc array to Typeinfo array.
    */
   static ObjectInspector[] getStandardObjectInspector(ArrayList<TypeInfo> exprs) {
@@ -2328,7 +2339,8 @@ public class SemanticAnalyzer extends Ba
       ArrayList<ExprNodeDesc> aggParameters, ASTNode aggTree,
       boolean isDistinct, boolean isAllColumns)
       throws SemanticException {
-    ArrayList<TypeInfo> originalParameterTypeInfos = getTypeInfo(aggParameters);
+    ArrayList<ObjectInspector> originalParameterTypeInfos =
+      getWritableObjectInspector(aggParameters);
     GenericUDAFEvaluator result = FunctionRegistry.getGenericUDAFEvaluator(
         aggName, originalParameterTypeInfos, isDistinct, isAllColumns);
     if (null == result) {
@@ -2365,9 +2377,12 @@ public class SemanticAnalyzer extends Ba
     // set r.returnType
     ObjectInspector returnOI = null;
     try {
-      ObjectInspector[] aggObjectInspectors =
-          getStandardObjectInspector(getTypeInfo(aggParameters));
-      returnOI = r.genericUDAFEvaluator.init(emode, aggObjectInspectors);
+      ArrayList<ObjectInspector> aggOIs = getWritableObjectInspector(aggParameters);
+      ObjectInspector[] aggOIArray = new ObjectInspector[aggOIs.size()];
+      for (int ii = 0; ii < aggOIs.size(); ++ii) {
+        aggOIArray[ii] = aggOIs.get(ii);
+      }
+      returnOI = r.genericUDAFEvaluator.init(emode, aggOIArray);
       r.returnType = TypeInfoUtils.getTypeInfoFromObjectInspector(returnOI);
     } catch (HiveException e) {
       throw new SemanticException(e);

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/AbstractGenericUDAFResolver.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/AbstractGenericUDAFResolver.java?rev=1185511&r1=1185510&r2=1185511&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/AbstractGenericUDAFResolver.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/AbstractGenericUDAFResolver.java Tue Oct 18 07:22:39 2011
@@ -46,4 +46,11 @@ public abstract class AbstractGenericUDA
 
     return getEvaluator(info.getParameters());
   }
+
+  @Override
+  public GenericUDAFEvaluator getEvaluator(TypeInfo[] info) 
+    throws SemanticException {
+    throw new SemanticException(
+          "This UDAF does not support the deprecated getEvaluator() method.");
+  }
 }

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFParameterInfo.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFParameterInfo.java?rev=1185511&r1=1185510&r2=1185511&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFParameterInfo.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFParameterInfo.java Tue Oct 18 07:22:39 2011
@@ -17,6 +17,7 @@
  */
 package org.apache.hadoop.hive.ql.udf.generic;
 
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
 import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo;
 
 /**
@@ -45,9 +46,16 @@ public interface GenericUDAFParameterInf
    *
    * @return the parameter type list passed into the UDAF.
    */
+  @Deprecated
   TypeInfo[] getParameters();
 
   /**
+   *
+   * @return getParameters() with types returned as ObjectInspectors.
+   */
+  ObjectInspector[] getParameterObjectInspectors();
+
+  /**
    * Returns <tt>true</tt> if the UDAF invocation was qualified with
    * <tt>DISTINCT</tt> keyword. Note that this is provided for informational
    * purposes only and the function implementation is not expected to ensure

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFPercentileApprox.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFPercentileApprox.java?rev=1185511&r1=1185510&r2=1185511&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFPercentileApprox.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFPercentileApprox.java Tue Oct 18 07:22:39 2011
@@ -27,8 +27,11 @@ import org.apache.hadoop.hive.ql.exec.UD
 import org.apache.hadoop.hive.ql.metadata.HiveException;
 import org.apache.hadoop.hive.ql.parse.SemanticException;
 import org.apache.hadoop.hive.serde2.io.DoubleWritable;
+import org.apache.hadoop.hive.serde2.objectinspector.ConstantObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.ListObjectInspector;
 import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
 import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils;
 import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
 import org.apache.hadoop.hive.serde2.objectinspector.StandardMapObjectInspector;
 import org.apache.hadoop.hive.serde2.objectinspector.StandardListObjectInspector;
@@ -38,9 +41,6 @@ import org.apache.hadoop.hive.serde2.obj
 import org.apache.hadoop.hive.serde2.objectinspector.primitive.WritableDoubleObjectInspector;
 import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
 import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorUtils;
-import org.apache.hadoop.hive.serde2.typeinfo.PrimitiveTypeInfo;
-import org.apache.hadoop.hive.serde2.typeinfo.ListTypeInfo;
-import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo;
 import org.apache.hadoop.util.StringUtils;
 
 /**
@@ -67,11 +67,12 @@ import org.apache.hadoop.util.StringUtil
                "Example (three percentiles requested using a finer histogram approximation):\n" +
                "> SELECT percentile_approx(val, array(0.5, 0.95, 0.98), 100000) FROM somedata;\n" +
                "[0.05,1.64,2.26]\n")
-public class GenericUDAFPercentileApprox implements GenericUDAFResolver {
+public class GenericUDAFPercentileApprox extends AbstractGenericUDAFResolver {
   static final Log LOG = LogFactory.getLog(GenericUDAFPercentileApprox.class.getName());
 
   @Override
-  public GenericUDAFEvaluator getEvaluator(TypeInfo[] parameters) throws SemanticException {
+  public GenericUDAFEvaluator getEvaluator(GenericUDAFParameterInfo info) throws SemanticException {
+    ObjectInspector[] parameters = info.getParameterObjectInspectors();
     if (parameters.length != 2 && parameters.length != 3) {
       throw new UDFArgumentTypeException(parameters.length - 1,
           "Please specify either two or three arguments.");
@@ -84,7 +85,7 @@ public class GenericUDAFPercentileApprox
           "Only primitive type arguments are accepted but "
           + parameters[0].getTypeName() + " was passed as parameter 1.");
     }
-    switch (((PrimitiveTypeInfo) parameters[0]).getPrimitiveCategory()) {
+    switch (((PrimitiveObjectInspector) parameters[0]).getPrimitiveCategory()) {
     case BYTE:
     case SHORT:
     case INT:
@@ -104,7 +105,7 @@ public class GenericUDAFPercentileApprox
     switch(parameters[1].getCategory()) {
     case PRIMITIVE:
       // Only a single double was passed as parameter 2, a single quantile is being requested
-      switch(((PrimitiveTypeInfo) parameters[1]).getPrimitiveCategory()) {
+      switch(((PrimitiveObjectInspector) parameters[1]).getPrimitiveCategory()) {
       case FLOAT:
       case DOUBLE:
         break;
@@ -117,7 +118,7 @@ public class GenericUDAFPercentileApprox
 
     case LIST:
       // An array was passed as parameter 2, make sure it's an array of primitives
-      if(((ListTypeInfo) parameters[1]).getListElementTypeInfo().getCategory() !=
+      if(((ListObjectInspector) parameters[1]).getListElementObjectInspector().getCategory() !=
          ObjectInspector.Category.PRIMITIVE) {
           throw new UDFArgumentTypeException(1,
             "A float/double array argument may be passed as parameter 2, but "
@@ -125,7 +126,7 @@ public class GenericUDAFPercentileApprox
       }
       // Now make sure it's an array of doubles or floats. We don't allow integer types here
       // because percentile (really, quantile) values should generally be strictly between 0 and 1.
-      switch(((PrimitiveTypeInfo)((ListTypeInfo) parameters[1]).getListElementTypeInfo()).
+      switch(((PrimitiveObjectInspector)((ListObjectInspector) parameters[1]).getListElementObjectInspector()).
              getPrimitiveCategory()) {
       case FLOAT:
       case DOUBLE:
@@ -143,6 +144,12 @@ public class GenericUDAFPercentileApprox
         "Only a float/double or float/double array argument is accepted as parameter 2, but "
         + parameters[1].getTypeName() + " was passed instead.");
     }
+    // Also make sure it is a constant.
+    if (!ObjectInspectorUtils.isConstantObjectInspector(parameters[1])) {
+      throw new UDFArgumentTypeException(1,
+        "The second argument must be a constant, but " + parameters[1].getTypeName() + 
+        " was passed instead.");
+    }
 
     // If a third parameter has been specified, it should be an integer that specifies the number
     // of histogram bins to use in the percentile approximation.
@@ -151,7 +158,7 @@ public class GenericUDAFPercentileApprox
         throw new UDFArgumentTypeException(2, "Only a primitive argument is accepted as "
            + "parameter 3, but " + parameters[2].getTypeName() + " was passed instead.");
       }
-      switch(((PrimitiveTypeInfo) parameters[2]).getPrimitiveCategory()) {
+      switch(((PrimitiveObjectInspector) parameters[2]).getPrimitiveCategory()) {
       case BYTE:
       case SHORT:
       case INT:
@@ -162,6 +169,12 @@ public class GenericUDAFPercentileApprox
         throw new UDFArgumentTypeException(2, "Only an integer argument is accepted as "
            + "parameter 3, but " + parameters[2].getTypeName() + " was passed instead.");
       }
+      // Also make sure it is a constant.
+      if (!ObjectInspectorUtils.isConstantObjectInspector(parameters[2])) {
+        throw new UDFArgumentTypeException(2,
+          "The third argument must be a constant, but " + parameters[2].getTypeName() + 
+          " was passed instead.");
+      }
     }
 
     // Return an evaluator depending on the return type
@@ -182,9 +195,11 @@ public class GenericUDAFPercentileApprox
       // init input object inspectors
       if (m == Mode.PARTIAL1 || m == Mode.COMPLETE) {
         inputOI = (PrimitiveObjectInspector) parameters[0];
-        quantilesOI = parameters[1];
+        quantiles = getQuantileArray((ConstantObjectInspector)parameters[1]);
         if(parameters.length > 2) {
-          nbinsOI = (PrimitiveObjectInspector) parameters[2];
+          nbins = PrimitiveObjectInspectorUtils.getInt(
+              ((ConstantObjectInspector) parameters[2]).getWritableConstantValue(),
+              (PrimitiveObjectInspector)parameters[2]);
         }
       } else {
         loi = (StandardListObjectInspector) parameters[0];
@@ -230,9 +245,11 @@ public class GenericUDAFPercentileApprox
       // init input object inspectors
       if (m == Mode.PARTIAL1 || m == Mode.COMPLETE) {
         inputOI = (PrimitiveObjectInspector) parameters[0];
-        quantilesOI = parameters[1];
+        quantiles = getQuantileArray((ConstantObjectInspector)parameters[1]);
         if(parameters.length > 2) {
-          nbinsOI = (PrimitiveObjectInspector) parameters[2];
+          nbins = PrimitiveObjectInspectorUtils.getInt(
+              ((ConstantObjectInspector) parameters[2]).getWritableConstantValue(),
+              (PrimitiveObjectInspector)parameters[2]);
         }
       } else {
         loi = (StandardListObjectInspector) parameters[0];
@@ -274,8 +291,8 @@ public class GenericUDAFPercentileApprox
   public abstract static class GenericUDAFPercentileApproxEvaluator extends GenericUDAFEvaluator {
     // For PARTIAL1 and COMPLETE: ObjectInspectors for original data
     protected PrimitiveObjectInspector inputOI;
-    protected ObjectInspector quantilesOI;
-    protected PrimitiveObjectInspector nbinsOI;
+    protected double quantiles[];
+    protected Integer nbins = 10000;
 
     // For PARTIAL2 and FINAL: ObjectInspectors for partial aggregations (list of doubles)
     protected StandardListObjectInspector loi;
@@ -328,49 +345,6 @@ public class GenericUDAFPercentileApprox
       }
       PercentileAggBuf myagg = (PercentileAggBuf) agg;
 
-      // Parse out the requested quantiles just once, if we haven't already done so before.
-      if(myagg.quantiles == null) {
-        if(quantilesOI.getCategory() == ObjectInspector.Category.LIST) {
-          // Multiple quantiles are requested
-          int nquantiles = ((StandardListObjectInspector) quantilesOI).getListLength(parameters[1]);
-          assert(nquantiles >= 1);
-          myagg.quantiles = new double[nquantiles];
-          StandardListObjectInspector sloi = (StandardListObjectInspector) quantilesOI;
-          for(int i = 0; i < nquantiles; i++) {
-            myagg.quantiles[i] = PrimitiveObjectInspectorUtils.getDouble(
-                                  sloi.getListElement(parameters[1], i), 
-                                  (PrimitiveObjectInspector) sloi.getListElementObjectInspector());
-          }
-        } else {
-          // Just one quantile is requested
-          myagg.quantiles = new double[1];
-          myagg.quantiles[0] = PrimitiveObjectInspectorUtils.getDouble(parameters[1], 
-                               (PrimitiveObjectInspector) quantilesOI);
-        }
-
-
-        // Validate requested quantiles, make sure they're in [0,1]
-        for(int i = 0; i < myagg.quantiles.length; i++) {
-          if(myagg.quantiles[i] <= 0 || myagg.quantiles[i] >= 1) {
-            throw new HiveException(getClass().getSimpleName() + " requires percentile values to "
-                                    + "lie strictly between 0 and 1, but you supplied "
-                                    + myagg.quantiles[i]);
-
-          }
-        } 
-      }
-
-      // Parse out the number of histogram bins just once, if we haven't done so before.
-      if(!myagg.histogram.isReady()) {
-        if(parameters.length == 3 && nbinsOI != null) {
-          // User has specified the number of histogram bins to use
-          myagg.histogram.allocate(PrimitiveObjectInspectorUtils.getInt(parameters[2], nbinsOI)); 
-        } else {
-          // Choose a nice default value.
-          myagg.histogram.allocate(10000);
-        }
-      }
-
       // Get and process the current datum
       double v = PrimitiveObjectInspectorUtils.getDouble(parameters[0], inputOI);
       myagg.histogram.add(v);
@@ -391,11 +365,45 @@ public class GenericUDAFPercentileApprox
       return result;
     }
 
+    protected double[] getQuantileArray(ConstantObjectInspector quantileOI)
+        throws HiveException {
+      double[] result = null;
+      Object quantileObj = quantileOI.getWritableConstantValue();
+      if (quantileOI instanceof ListObjectInspector) {
+        ObjectInspector elemOI =
+            ((ListObjectInspector)quantileOI).getListElementObjectInspector();
+        result = new double[((List<?>)quantileObj).size()];
+        assert(result.length >= 1);
+        for (int ii = 0; ii < result.length; ++ii) {
+          result[ii] = PrimitiveObjectInspectorUtils.getDouble(
+              ((List<?>)quantileObj).get(ii),
+              (PrimitiveObjectInspector)elemOI);
+        }
+      } else {
+        result = new double[1];
+        result[0] = PrimitiveObjectInspectorUtils.getDouble(
+              quantileObj, 
+              (PrimitiveObjectInspector)quantileOI);
+      }
+      for(int ii = 0; ii < result.length; ++ii) {
+        if (result[ii] <= 0 || result[ii] >= 1) {
+          throw new HiveException(
+              getClass().getSimpleName() + " requires percentile values to " +
+              "lie strictly between 0 and 1, but you supplied " + result[ii]);
+        }
+      }
+
+      return result;
+    }
+
     @Override
     public void reset(AggregationBuffer agg) throws HiveException {
       PercentileAggBuf result = (PercentileAggBuf) agg;
       result.histogram.reset();
       result.quantiles = null;
+
+      result.histogram.allocate(nbins);
+      result.quantiles = quantiles;
     }
   }
 }

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/SimpleGenericUDAFParameterInfo.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/SimpleGenericUDAFParameterInfo.java?rev=1185511&r1=1185510&r2=1185511&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/SimpleGenericUDAFParameterInfo.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/SimpleGenericUDAFParameterInfo.java Tue Oct 18 07:22:39 2011
@@ -17,7 +17,9 @@
  */
 package org.apache.hadoop.hive.ql.udf.generic;
 
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
 import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo;
+import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoUtils;
 
 /**
  * A simple implementation of <tt>GenericUDAFParameterInfo</tt>.
@@ -26,11 +28,11 @@ import org.apache.hadoop.hive.serde2.typ
 public class SimpleGenericUDAFParameterInfo implements GenericUDAFParameterInfo
 {
 
-  private final TypeInfo[] parameters;
+  private final ObjectInspector[] parameters;
   private final boolean distinct;
   private final boolean allColumns;
 
-  public SimpleGenericUDAFParameterInfo(TypeInfo[] params, boolean distinct,
+  public SimpleGenericUDAFParameterInfo(ObjectInspector[] params, boolean distinct,
       boolean allColumns) {
     this.parameters = params;
     this.distinct = distinct;
@@ -38,7 +40,17 @@ public class SimpleGenericUDAFParameterI
   }
 
   @Override
+  @Deprecated
   public TypeInfo[] getParameters() {
+    TypeInfo[] result = new TypeInfo[parameters.length];
+    for (int ii = 0; ii < parameters.length; ++ii) {
+      result[ii] =
+        TypeInfoUtils.getTypeInfoFromObjectInspector(parameters[ii]);
+    }
+    return result;
+  }
+
+  public ObjectInspector[] getParameterObjectInspectors() {
     return parameters;
   }