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 > >> > > >> >
