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;
}