Hi, I have implemented a simple UDAF for top-n-percent as follows: import java.util.ArrayList; import java.util.Collections;
import org.apache.hadoop.hive.ql.exec.UDAF; import org.apache.hadoop.hive.ql.exec.UDAFEvaluator; public class UDAFTopNPercent extends UDAF{ public static class Result { ArrayList<Double> list; double min; } public class TopNPercentEvaluator implements UDAFEvaluator { private Result res; private int rowIndex; private int percent; public TopNPercentEvaluator() { super(); res = new Result(); init(); rowIndex = 0; } @Override public void init() { res.list = new ArrayList<Double>(); res.min = Double.MAX_VALUE; } public boolean iterate(Double rowVal, int pct) { ArrayList<Double> resList = res.list; rowIndex++; resList.add(rowVal); percent = pct; return true; } public ArrayList<Double> terminatePartial() { ArrayList<Double> resList = res.list; Collections.sort(resList); return resList; } public boolean merge(ArrayList<Double> otherList) { ArrayList<Double> resList = res.list; resList.addAll(otherList); return true; } public ArrayList<Double> terminate() { ArrayList<Double> resList = res.list; double num_rows = (double)percent/100.0*rowIndex; Collections.sort(resList); int lastIdx = resList.size()- (int) num_rows; if(lastIdx <= 0) { return resList; } for(int i=0; i<lastIdx; i++) { resList.remove(i); } return resList; } } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub } } But throws some error such as first few lines are: FAILED: Hive Internal Error: java.lang.ClassCastException(org.apache.hadoop.hive.serde2.objectinspector.primitive.WritableFloatObjectInspector cannot be cast to org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector) java.lang.ClassCastException: org.apache.hadoop.hive.serde2.objectinspector.primitive.WritableFloatObjectInspector cannot be cast to org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector at org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters.getConverter(ObjectInspectorConverters.java:116) at org.apache.hadoop.hive.ql.udf.generic.GenericUDFUtils$ConversionHelper.<init>(GenericUDFUtils.java:300) at org.apache.hadoop.hive.ql.udf.generic.GenericUDAFBridge$GenericUDAFBridgeEvaluator.init(GenericUDAFBridge.java:129) Please help me to debug this! Is it throwing from returning ArrayList<Double> in terminate()? How should I return a List from UDAF? Thanks, Abhishek