Hi Nirav,

No problem!

Your 'src/main/resources/drill-module.conf' file should look like this:

drill {
  classpath.scanning {
    packages : ${?drill.classpath.scanning.packages} [
      com.yourgroupidentifier.udf
    ]
  }
}

where 'com.yourgroupidentifier.udf' should be your package identifier.

The first part of this blog post can give you more context if you feel
like you need it:

http://www.dremio.com/blog/querying-google-analytics-json-with-a-custom-sql-function/

Best,
Nathan

On Sat, Jan 9, 2016 at 6:40 AM, Nirav Shah <[email protected]> wrote:
> Thanks Nathan for spending time on this issue.
>
> I have just put blank file in project.
> Do I need to write something in this file?
> On Jan 8, 2016 10:23 PM, "Nathan Griffith" <[email protected]> wrote:
>
>> Hi again Nirav,
>>
>> Yup that looks like Drill just isn't finding the function. Do you have
>> a '/src/main/resources/drill-module.conf' file set up in your Maven
>> project for the UDF? If so, could you paste the text here?
>>
>> Best,
>> Nathan
>>
>> On Thu, Jan 7, 2016 at 11:03 PM, Nirav Shah <[email protected]>
>> wrote:
>> > Sorry for delayed response.
>> >
>> > @Abdel,
>> > I have put both jars in 3rdparty jars. My other UDFs are working fine.
>> >
>> > @Nathan
>> > I tried this still same issue.
>> >
>> > May be I am doing some silly mistake.
>> >
>> > *Complete Code :*
>> >
>> > package com.games24x7.drill;
>> >
>> > import java.util.Date;
>> >
>> > import javax.inject.Inject;
>> >
>> > import org.apache.drill.exec.expr.DrillSimpleFunc;
>> > import org.apache.drill.exec.expr.annotations.FunctionTemplate;
>> > import org.apache.drill.exec.expr.annotations.Output;
>> > import org.apache.drill.exec.expr.annotations.Param;
>> > import org.apache.drill.exec.expr.holders.IntHolder;
>> > import org.apache.drill.exec.expr.holders.NullableVarCharHolder;
>> > import org.apache.drill.exec.expr.holders.VarCharHolder;
>> >
>> > import io.netty.buffer.DrillBuf;
>> > import net.sourceforge.wurfl.core.Device;
>> > import net.sourceforge.wurfl.core.EngineTarget;
>> >
>> > @FunctionTemplate(name = "GetBrowserDtl", scope =
>> > FunctionTemplate.FunctionScope.SIMPLE, nulls =
>> > FunctionTemplate.NullHandling.NULL_IF_NULL)
>> > public  class BrowserFuncNew implements DrillSimpleFunc {
>> >
>> >     @Param
>> >     NullableVarCharHolder userAgent;
>> >     @Param
>> >     IntHolder option;
>> >     @Output
>> >     VarCharHolder outValue;
>> >     @Inject
>> >     DrillBuf buffer;
>> >     @Inject
>> >     net.sourceforge.wurfl.core.GeneralWURFLEngine wurfl;
>> >     public void setup() {
>> >         // TODO Auto-generated method stub
>> >         //wurfl = new
>> > net.sourceforge.wurfl.core.GeneralWURFLEngine("wurfl.xml");
>> >     }
>> >
>> >     public void eval() {
>> >         String stringOutValue = "null";
>> >
>> >         try {
>> >             wurfl = new
>> > net.sourceforge.wurfl.core.GeneralWURFLEngine("/home/nirav/wurfl.xml");
>> >     //        String SUA =
>> >
>> org.apache.drill.exec.expr.fn.impl.StringFunctionHelpers.toStringFromUTF8(userAgent.start,
>> > userAgent.end, userAgent.buffer);
>> >
>> >
>> > /*            String[] capabilities = {
>> >                     "device_os",
>> >                     "device_os_version",
>> >                     "is_tablet",
>> >                     "is_wireless_device",
>> >                     "pointing_method",
>> >                     "preferred_markup",
>> >                     "resolution_height",
>> >                     "resolution_width",
>> >                     "ux_full_desktop",
>> >                     "xhtml_support_level",
>> >                     "is_smarttv",
>> >                     "can_assign_phone_number",
>> >                     "brand_name",
>> >                     "model_name",
>> >                     "marketing_name",
>> >                     "mobile_browser_version"
>> >                 };
>> >             wurfl.setEngineTarget(EngineTarget.accuracy);
>> >             wurfl.setCapabilityFilter(capabilities);
>> >             Device device = wurfl.getDeviceForRequest(SUA);
>> >             System.out.println("4-->"+new Date(
>> > System.currentTimeMillis()));
>> >             System.out.println("Device OS: " +
>> > device.getCapability("device_os"));
>> >             System.out.println("Device OS version: " +
>> > device.getCapability("device_os_version"));
>> >             System.out.println("Brand name: " +
>> > device.getCapability("brand_name"));
>> >             System.out.println("advertised_device_os_version: " +
>> > device.getCapability("advertised_device_os_version"));
>> >             System.out.println("advertised_device_os: " +
>> > device.getCapability("advertised_device_os"));
>> >             System.out.println("advertised_browser: " +
>> > device.getCapability("advertised_browser"));
>> >
>> >
>> System.out.println("advertised_browser_version:"+device.getCapability("advertised_browser_version"));
>> >             stringOutValue = device.getCapability("device_os_version");
>> > */
>> >             byte[] valueDecoded = stringOutValue.getBytes();
>> >             outValue.buffer =
>> buffer.reallocIfNeeded(valueDecoded.length);
>> >             outValue.start = 0;
>> >             outValue.end = valueDecoded.length;
>> >             buffer.setBytes(0, valueDecoded);
>> >         } catch (Exception e) {
>> >             // TODO Auto-generated catch block
>> >             //stringOutValue = "null6";
>> >             byte[] valueDecoded = e.getMessage().getBytes();
>> >             outValue.buffer =
>> buffer.reallocIfNeeded(valueDecoded.length);
>> >             outValue.start = 0;
>> >             outValue.end = valueDecoded.length;
>> >             buffer.setBytes(0, valueDecoded);
>> >
>> >         }
>> >
>> >     }
>> > }
>> > // select GetBrowserDtl('Mozilla/5.0 (X11; Linux x86_64)
>> AppleWebKit/537.36
>> > (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36',1) from
>> (values(1));
>> > //select GetBrowserDtl('Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:31.0)
>> > Gecko/20100101 Firefox/31.0',1) from (values(1));
>> > //select GetBrowserDtl('Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:31.0)
>> > Gecko/20100101 Firefox/31.0',1) from (values(1));
>> >
>> > *Result:*
>> >
>> > 0: jdbc:drill:zk=local> select GetBrowserDtl('Mozilla/5.0 (X11; Linux
>> > x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80
>> > Safari/537.36',1) from (values(1));
>> > Jan 08, 2016 12:14:17 PM
>> > org.apache.calcite.sql.validate.SqlValidatorException <init>
>> > SEVERE: org.apache.calcite.sql.validate.SqlValidatorException: No match
>> > found for function signature GetBrowserDtl(<CHARACTER>, <NUMERIC>)
>> > Jan 08, 2016 12:14:17 PM org.apache.calcite.runtime.CalciteException
>> <init>
>> > SEVERE: org.apache.calcite.runtime.CalciteContextException: From line 1,
>> > column 8 to line 1, column 130: No match found for function signature
>> > GetBrowserDtl(<CHARACTER>, <NUMERIC>)
>> > Error: VALIDATION ERROR: From line 1, column 8 to line 1, column 130: No
>> > match found for function signature GetBrowserDtl(<CHARACTER>, <NUMERIC>)
>> >
>> >
>> > [Error Id: 5a8c24d3-1b26-4dfd-be6d-615ba051ad1c on nirav:31010]
>> > (state=,code=0)
>> >
>> >
>> > On Thu, Jan 7, 2016 at 2:55 AM, Nathan Griffith <[email protected]>
>> > wrote:
>> >
>> >> Hi Nirav!
>> >>
>> >> A couple thoughts: a.) To help troubleshoot, you may want to prepend
>> >> the full path of "wurfl.xml" in the first statement of your code, b.)
>> >> So when you try to use the UDF in a query you get absolutely no error
>> >> messages from Drill?
>> >>
>> >> Also, the first part of this article
>> >> (
>> >>
>> http://www.dremio.com/blog/querying-google-analytics-json-with-a-custom-sql-function/
>> >> )
>> >> makes a good resource for telling Drill how to pick up on a new UDF.
>> >>
>> >> Best,
>> >> Nathan
>> >>
>> >> On Wed, Jan 6, 2016 at 10:23 AM, Abdel Hakim Deneche
>> >> <[email protected]> wrote:
>> >> > According to Drill documentation:
>> >> >
>> >> > http://drill.apache.org/docs/adding-custom-functions-to-drill/
>> >> >
>> >> > You need to copy both class jar and source jar of your UDF to
>> >> > $DRILL_HOME/jars/3rdparty/
>> >> >
>> >> > did you do it ?
>> >> >
>> >> > On Tue, Jan 5, 2016 at 11:58 PM, Nirav Shah <[email protected]
>> >
>> >> > wrote:
>> >> >
>> >> >> Hi ,
>> >> >>
>> >> >>
>> >> >> I am trying to extract info from user agent using WURFL libraries.
>> >> >>
>> >> >> I am not sure what's wrong I am doing here but it's not working and
>> not
>> >> >> giving any errors as well.
>> >> >>
>> >> >> I have put wurfl.xml in source folder and  wurfl<version>.jar to
>> >> >> /jar/3rdparty/
>> >> >>
>> >> >> *Code :*
>> >> >>
>> >> >>         wurfl = new
>> >> >> net.sourceforge.wurfl.core.GeneralWURFLEngine("wurfl.xml");
>> >> >>             String SUA =
>> >> >>
>> >> >>
>> >>
>> org.apache.drill.exec.expr.fn.impl.StringFunctionHelpers.toStringFromUTF8(userAgent.start,
>> >> >> userAgent.end, userAgent.buffer);
>> >> >>
>> >> >>
>> >> >>             String[] capabilities = {
>> >> >>                     "device_os",
>> >> >>                     "device_os_version",
>> >> >>                     "is_tablet",
>> >> >>                     "is_wireless_device",
>> >> >>                     "pointing_method",
>> >> >>                     "preferred_markup",
>> >> >>                     "resolution_height",
>> >> >>                     "resolution_width",
>> >> >>                     "ux_full_desktop",
>> >> >>                     "xhtml_support_level",
>> >> >>                     "is_smarttv",
>> >> >>                     "can_assign_phone_number",
>> >> >>                     "brand_name",
>> >> >>                     "model_name",
>> >> >>                     "marketing_name",
>> >> >>                     "mobile_browser_version"
>> >> >>                 };
>> >> >>             wurfl.setEngineTarget(EngineTarget.accuracy);
>> >> >>             wurfl.setCapabilityFilter(capabilities);
>> >> >>             Device device = wurfl.getDeviceForRequest(SUA);
>> >> >>             System.out.println("4-->"+new Date(
>> >> >> System.currentTimeMillis()));
>> >> >>             System.out.println("Device OS: " +
>> >> >> device.getCapability("device_os"));
>> >> >>             System.out.println("Device OS version: " +
>> >> >> device.getCapability("device_os_version"));
>> >> >>             System.out.println("Brand name: " +
>> >> >> device.getCapability("brand_name"));
>> >> >>             System.out.println("advertised_device_os_version: " +
>> >> >> device.getCapability("advertised_device_os_version"));
>> >> >>             System.out.println("advertised_device_os: " +
>> >> >> device.getCapability("advertised_device_os"));
>> >> >>             System.out.println("advertised_browser: " +
>> >> >> device.getCapability("advertised_browser"));
>> >> >>
>> >> >>
>> >> >>
>> >>
>> System.out.println("advertised_browser_version:"+device.getCapability("advertised_browser_version"));
>> >> >>             stringOutValue =
>> device.getCapability("device_os_version");
>> >> >>
>> >> >>
>> >> >> Regards,
>> >> >> Nirav
>> >> >>
>> >> >
>> >> >
>> >> >
>> >> > --
>> >> >
>> >> > Abdelhakim Deneche
>> >> >
>> >> > Software Engineer
>> >> >
>> >> >   <http://www.mapr.com/>
>> >> >
>> >> >
>> >> > Now Available - Free Hadoop On-Demand Training
>> >> > <
>> >>
>> http://www.mapr.com/training?utm_source=Email&utm_medium=Signature&utm_campaign=Free%20available
>> >> >
>> >>
>>

Reply via email to