Hey Nirav, Drill may be hitting some error when trying to load the UDF, try looking in drillbits.log for error messages when the Drillbit starts up.
On Sun, Jan 10, 2016 at 9:38 PM, Nirav Shah <[email protected]> wrote: > Hi Nathan, > No luck. this is also not working. > 😢😢 > > regards, > Nirav > > On Mon, Jan 11, 2016 at 12:56 AM, Nathan Griffith <[email protected]> > wrote: > > > 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 > > >> >> > > > >> >> > > >> > > > -- 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>
