Hi Abhishek,
The code looks incomplete.

See the comment at
https://github.com/apache/hive/blob/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/UDAF.java#L22
Those are all the methods your UDAF class needs to implement but you seem
to be missing them.

Mark

On Sat, Feb 9, 2013 at 11:08 PM, Abhishek Bhattacharya <abhat...@fiu.edu>wrote:

> Thanks for the response.
> The link to the code is:
> https://github.com/Abhishek2301/Hive/blob/master/src/UDAFTopNPercent.java
> Please let me know to fix it!
>
> Thanks,
> Abhishek
>
>
>
> On Fri, Feb 8, 2013 at 5:02 PM, Mark Grover 
> <grover.markgro...@gmail.com>wrote:
>
>> Abhishek,
>> The code doesn't seem to be complete.
>>
>> Look at
>> https://github.com/apache/hive/blob/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDAFPercentile.javafor
>>  reference. It has two terminate()'s - one for UDAF and one for the
>> Evaluator.
>>
>> Do you mind posting your complete code on github somewhere so it's easier
>> to analyze?
>>
>> Mark
>>
>> On Fri, Feb 8, 2013 at 2:05 PM, Abhishek Bhattacharya 
>> <abhat...@fiu.edu>wrote:
>>
>>> 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
>>>
>>
>>
>
>
> --
> Thanks and Regards,
>
> Abhishek Bhattacharya
> PhD Computer Science
> School of Computing and Information Sciences
> Florida International University
>

Reply via email to