Hi Robin,

Thanks for the response.
The point mentioned by you is one of the many other serious issues in the
code.
I have fixed all of them and it is pretty much in a good shape presently
after some testing.
You can find it at:
https://github.com/Abhishek2301/Hive/blob/master/src/UDAFTopNPercent.java
Let me know if you face any other issues!

Thanks,
Abhishek


On Wed, Feb 13, 2013 at 7:02 PM, Robin Morris <r...@baynote.com> wrote:

>  Hi,
>
>  You might well have found the error yourself by now, but if not, the
> problem is that you missed the "static" keyword off the declaration of
> TopNPercentEvaluator.  Line 18 of your code should read
>
>       public static class TopNPercentEvaluator implements UDAFEvaluator {
>
>  then this error goes away.
>
>  A new error appears, however, because there's a bug in your terminate()
> function that reads off the end of the array.
>
>  Robin
>
>
>   From: Abhishek Bhattacharya <abhat...@fiu.edu>
> Reply-To: "user@hive.apache.org" <user@hive.apache.org>
> Date: Tuesday, February 12, 2013 10:29 AM
> To: "user@hive.apache.org" <user@hive.apache.org>
> Subject: Fwd: Help to solve UDAF errors!
>
>    Hi,
>
>  I looked through the syslogs and found the following exceptions.
>  Can anyone help me to figure out the point of error?
>
> java.lang.RuntimeException: Error in configuring object
>       at 
> org.apache.hadoop.util.ReflectionUtils.setJobConf(ReflectionUtils.java:93)
>       at 
> org.apache.hadoop.util.ReflectionUtils.setConf(ReflectionUtils.java:64)
>       at 
> org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:117)
>       at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:387)
>       at org.apache.hadoop.mapred.MapTask.run(MapTask.java:325)
>       at org.apache.hadoop.mapred.Child$4.run(Child.java:270)
>       at java.security.AccessController.doPrivileged(Native Method)
>       at javax.security.auth.Subject.doAs(Subject.java:396)
>       at 
> org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1177)
>       at org.apache.hadoop.mapred.Child.main(Child.java:264)
> Caused by: java.lang.reflect.InvocationTargetException
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>       at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>       at java.lang.reflect.Method.invoke(Method.java:597)
>       at 
> org.apache.hadoop.util.ReflectionUtils.setJobConf(ReflectionUtils.java:88)
>       ... 9 more
> Caused by: java.lang.RuntimeException: Error in configuring object
>       at 
> org.apache.hadoop.util.ReflectionUtils.setJobConf(ReflectionUtils.java:93)
>       at 
> org.apache.hadoop.util.ReflectionUtils.setConf(ReflectionUtils.java:64)
>       at 
> org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:117)
>       at org.apache.hadoop.mapred.MapRunner.configure(MapRunner.java:34)
>       ... 14 more
> Caused by: java.lang.reflect.InvocationTargetException
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>       at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>       at java.lang.reflect.Method.invoke(Method.java:597)
>       at 
> org.apache.hadoop.util.ReflectionUtils.setJobConf(ReflectionUtils.java:88)
>       ... 17 more
> Caused by: java.lang.RuntimeException: Map operator initialization failed
>       at 
> org.apache.hadoop.hive.ql.exec.ExecMapper.configure(ExecMapper.java:121)
>       ... 22 more
> Caused by: java.lang.RuntimeException: java.lang.NoSuchMethodException: 
> com.orzota.hive.udaf.groupby.UDAFTopNPercent$TopNPercentEvaluator.<init>()
>       at 
> org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:115)
>       at 
> org.apache.hadoop.hive.ql.udf.generic.GenericUDAFBridge$GenericUDAFBridgeEvaluator.getNewAggregationBuffer(GenericUDAFBridge.java:160)
>       at 
> org.apache.hadoop.hive.ql.exec.GroupByOperator.newAggregations(GroupByOperator.java:536)
>       at 
> org.apache.hadoop.hive.ql.exec.GroupByOperator.initializeOp(GroupByOperator.java:332)
>       at org.apache.hadoop.hive.ql.exec.Operator.initialize(Operator.java:357)
>       at org.apache.hadoop.hive.ql.exec.Operator.initialize(Operator.java:433)
>       at 
> org.apache.hadoop.hive.ql.exec.Operator.initializeChildren(Operator.java:389)
>       at 
> org.apache.hadoop.hive.ql.exec.SelectOperator.initializeOp(SelectOperator.java:62)
>       at org.apache.hadoop.hive.ql.exec.Operator.initialize(Operator.java:357)
>       at org.apache.hadoop.hive.ql.exec.Operator.initialize(Operator.java:433)
>       at 
> org.apache.hadoop.hive.ql.exec.Operator.initializeChildren(Operator.java:389)
>       at 
> org.apache.hadoop.hive.ql.exec.TableScanOperator.initializeOp(TableScanOperator.java:133)
>       at org.apache.hadoop.hive.ql.exec.Operator.initialize(Operator.java:357)
>       at 
> org.apache.hadoop.hive.ql.exec.MapOperator.initializeOp(MapOperator.java:444)
>       at org.apache.hadoop.hive.ql.exec.Operator.initialize(Operator.java:357)
>       at 
> org.apache.hadoop.hive.ql.exec.ExecMapper.configure(ExecMapper.java:98)
>       ... 22 more
> Caused by: java.lang.NoSuchMethodException: 
> com.orzota.hive.udaf.groupby.UDAFTopNPercent$TopNPercentEvaluator.<init>()
>       at java.lang.Class.getConstructor0(Class.java:2706)
>       at java.lang.Class.getDeclaredConstructor(Class.java:1985)
>       at 
> org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:109)
>       ... 37 more
> 2013-02-12 07:21:14,049 INFO org.apache.hadoop.mapred.Task: Runnning cleanup 
> for the task
>
> ------------------------------
> Thanks,
>  Abhishek
>
>
>
> ---------- Forwarded message ----------
> From: Abhishek Bhattacharya <abhat...@fiu.edu>
> Date: Tue, Feb 12, 2013 at 12:48 PM
> Subject: Re: Help to solve UDAF errors!
> To: user@hive.apache.org
>
>
> Hi Mark,
>
>  Thanks for the response!
> The UDAFPercentile.java have two terminate() methods since it is handling
> two different input types by the two inner classes: PercentileLongEvaluator
> and PercentileLongArrayEvaluator.
> I am handling only a single input type of double from one table column to
> the iterate() method and wish to return an ArrayList<DoubleWritable> from
> the terminate() method.
> What is wrong in my class?
> Moreover, is there any way for UDF/UDAF/UDTF which can process all the
> rows of the table and output only a subset of the total rows based on some
> aggregation function of one column attribute i.e., similar to my case of
> computing the top-n-percent of a column attribute and output the entire set
> of filtered rows with all other columns from the table?
>
>  Thanks,
> Abhishek
>
>
>
> On Sun, Feb 10, 2013 at 12:36 PM, Mark Grover <grover.markgro...@gmail.com
> > wrote:
>
>> 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
>>>
>>
>>
>
>
>  --
> Thanks and Regards,
>
> Abhishek Bhattacharya
> PhD Computer Science
> School of Computing and Information Sciences
> Florida International University
>
>
>
> --
> Thanks and Regards,
>
> Abhishek Bhattacharya
> PhD Computer Science
> School of Computing and Information Sciences
> Florida International University
>



-- 
Thanks and Regards,

Abhishek Bhattacharya
PhD Computer Science
School of Computing and Information Sciences
Florida International University

Reply via email to