You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@hive.apache.org by Dan Fan <df...@appnexus.com> on 2014/07/30 16:43:17 UTC

hive udf cannot recognize generic method

Hi there

I am writing a hive UDF function. The input could be string, int, double etc.
The return is based on the data type. I was trying to use the generic method, however, hive seems not recognize it.
Here is the piece of code I have as example.


  public <T> T evaluate(final T s, final String column_name, final int bitmap) throws Exception {


     if (s instanceof Double)

            return (T) new Double(-1.0);

     Else if( s instance of Integer)

            Return (T) new Integer(-1) ;

…..

}


Does anyone know if hive supports the generic method ? Or I have to override the evaluate method for each type of input.


Thanks


Dan


Re: hive udf cannot recognize generic method

Posted by Navis류승우 <na...@nexr.com>.
I've booked this on https://issues.apache.org/jira/browse/HIVE-7588.

With the patch, something like below are possible.

// unknown input
public String evaluate(Object arg) {
  return arg == null ? null : String.valueOf(arg);
}
// typed variable
public <T> T evaluate(T arg) {
  return arg;
}
// typed variable, nested
public <T> T evaluate(Map<String, T> arg) {
  return arg.values().iterator().next();
}

Thanks,
Navis


2014-07-31 3:37 GMT+09:00 Jason Dere <jd...@hortonworks.com>:

> Sounds like you are using the older style UDF class.  In that case, yes
> you would have to override evaluate() for each type of input.
> You could also try overriding the GenericUDF class - that would allow you
> to do a single method, though it may be a bit more complicated (can look at
> the Hive code for some examples)
>
>
> On Jul 30, 2014, at 7:43 AM, Dan Fan <df...@appnexus.com> wrote:
>
> > Hi there
> >
> > I am writing a hive UDF function. The input could be string, int, double
> etc.
> > The return is based on the data type. I was trying to use the generic
> method, however, hive seems not recognize it.
> > Here is the piece of code I have as example.
> >
> >   public <T> T evaluate(final T s, final String column_name, final int
> bitmap) throws Exception {
> >
> >      if (s instanceof Double)
> >             return (T) new Double(-1.0);
> >      Else if( s instance of Integer)
> >             Return (T) new Integer(-1) ;
> > …..
> > }
> >
> > Does anyone know if hive supports the generic method ? Or I have to
> override the evaluate method for each type of input.
> >
> > Thanks
> >
> > Dan
> >
>
>
> --
> CONFIDENTIALITY NOTICE
> NOTICE: This message is intended for the use of the individual or entity to
> which it is addressed and may contain information that is confidential,
> privileged and exempt from disclosure under applicable law. If the reader
> of this message is not the intended recipient, you are hereby notified that
> any printing, copying, dissemination, distribution, disclosure or
> forwarding of this communication is strictly prohibited. If you have
> received this communication in error, please contact the sender immediately
> and delete it from your system. Thank You.
>

Re: hive udf cannot recognize generic method

Posted by Jason Dere <jd...@hortonworks.com>.
Sounds like you are using the older style UDF class.  In that case, yes you would have to override evaluate() for each type of input.
You could also try overriding the GenericUDF class - that would allow you to do a single method, though it may be a bit more complicated (can look at the Hive code for some examples)


On Jul 30, 2014, at 7:43 AM, Dan Fan <df...@appnexus.com> wrote:

> Hi there 
> 
> I am writing a hive UDF function. The input could be string, int, double etc.
> The return is based on the data type. I was trying to use the generic method, however, hive seems not recognize it. 
> Here is the piece of code I have as example.
> 
>   public <T> T evaluate(final T s, final String column_name, final int bitmap) throws Exception {
> 
>      if (s instanceof Double)
>             return (T) new Double(-1.0);
>      Else if( s instance of Integer)
>             Return (T) new Integer(-1) ;  
> …..
> }
> 
> Does anyone know if hive supports the generic method ? Or I have to override the evaluate method for each type of input. 
> 
> Thanks 
> 
> Dan
> 


-- 
CONFIDENTIALITY NOTICE
NOTICE: This message is intended for the use of the individual or entity to 
which it is addressed and may contain information that is confidential, 
privileged and exempt from disclosure under applicable law. If the reader 
of this message is not the intended recipient, you are hereby notified that 
any printing, copying, dissemination, distribution, disclosure or 
forwarding of this communication is strictly prohibited. If you have 
received this communication in error, please contact the sender immediately 
and delete it from your system. Thank You.

Re: hive udf cannot recognize generic method

Posted by Jason Dere <jd...@hortonworks.com>.
Sounds like you are using the older style UDF class.  In that case, yes you would have to override evaluate() for each type of input.
You could also try overriding the GenericUDF class - that would allow you to do a single method, though it may be a bit more complicated (can look at the Hive code for some examples)


On Jul 30, 2014, at 7:43 AM, Dan Fan <df...@appnexus.com> wrote:

> Hi there 
> 
> I am writing a hive UDF function. The input could be string, int, double etc.
> The return is based on the data type. I was trying to use the generic method, however, hive seems not recognize it. 
> Here is the piece of code I have as example.
> 
>   public <T> T evaluate(final T s, final String column_name, final int bitmap) throws Exception {
> 
>      if (s instanceof Double)
>             return (T) new Double(-1.0);
>      Else if( s instance of Integer)
>             Return (T) new Integer(-1) ;  
> …..
> }
> 
> Does anyone know if hive supports the generic method ? Or I have to override the evaluate method for each type of input. 
> 
> Thanks 
> 
> Dan
> 


-- 
CONFIDENTIALITY NOTICE
NOTICE: This message is intended for the use of the individual or entity to 
which it is addressed and may contain information that is confidential, 
privileged and exempt from disclosure under applicable law. If the reader 
of this message is not the intended recipient, you are hereby notified that 
any printing, copying, dissemination, distribution, disclosure or 
forwarding of this communication is strictly prohibited. If you have 
received this communication in error, please contact the sender immediately 
and delete it from your system. Thank You.