用猪写一个 udf 有点像教程

Posted

技术标签:

【中文标题】用猪写一个 udf 有点像教程【英文标题】:writing a udf in pig kind of like tutorial 【发布时间】:2012-11-12 15:49:25 【问题描述】:

我是 pig 新手.. 并且正在尝试编写一个 udf 函数。

所以基本上这里是问题陈述。

我有一个这样的虚拟数据..

 user_id, movie_id, date_time_stamp

所以我想做的就是这个。 如果交易是在

    9 am and 11 am --> breakfast
    and so on

这是我的猪脚本

     REGISTER path/myudfs.jar
      in = LOAD 'path/input' USING  
          PigStorage('\\u001') AS (user:long,movie:long, time:chararray);

     result = foreach in GENERATE  myudfs.time(time);
     STORE result INTO 'path/output/time' using PigStorage(',');

现在myudf.jar java代码是这样的

      public class time extends EvalFunc<String>

public String exec(Tuple input) throws IOException 

    if ((input == null) || (input.size() == 0))
        return null;
    try
        String time = (String) input.get(0) ;
        DateFormat df = new SimpleDateFormat("hh:mm:ss.000");
        Date date = df.parse(time);
        String timeOfDay = getTimeOfDay(date);
        return timeOfDay;
     catch (ParseException e) 
        //how will I handle when df.parse(time) fails and throws ParseException?
        //maybe:
        return null;
    



所以它接受元组并返回一个字符串......(我也是java新手......)

在这之后我尝试运行这个脚本

 pig -f time.pig

返回错误

   2012-11-12 08:33:08,214 [main] INFO    
    org.apache.pig.backend.hadoop.executionengine.HExecutionEngine - Connecting to  
  hadoop file system at: maprfs:///
  2012-11-12 08:33:08,353 [main] INFO  
      org.apache.pig.backend.hadoop.executionengine.HExecutionEngine - Connecting to  
                         map-reduce job tracker at: maprfs:///
  2012-11-12 08:33:08,767 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1069:  
     Problem resolving class version numbers for class myudfs.time

有人在 pig 邮件列表上发布的是我的 PIG_CLASSPATH 没有设置,我应该将它指向 /path/hadoop/conf

我做到了.. 所以现在 $echo PIG_CLASSPATH --> /path/hadoop/conf

但我得到同样的错误

请指教。 谢谢

编辑 1:查看日志时,错误跟踪是:

     Caused by: java.lang.UnsupportedClassVersionError: myudfs/time : Unsupported major.minor version 51.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at org.apache.pig.impl.PigContext.resolveClassName(PigContext.java:427)
... 27 more

这像 java 问题吗?

【问题讨论】:

'Unsupported version' 通常表明您的 jar 和 jdk 版本存在冲突。这已在 SO 上被多次询问,包括此处***.com/questions/7237536/… @DaveRlz:谢谢你给我线索..我也是java新手..因此不知道..我如何找出jar和jdk版本......?以及如何使它们兼容?我在 Windows 上使用标准 Eclipse.. 【参考方案1】:

要查找 jar 版本,请使用 winzip(或类似软件)打开 jar,然后查找 manifest.mf。那里应该有一行写着“Created-By”,这将给出用于构建 jar 的 java 版本。

这需要比您用于构建应用程序的 java 版本更旧或相同。如果您在命令行类型中执行此操作:

java -version

或者在eclipse中去

project(menu) > properties (menu item) > java build path (in list) > libraries (tab)

并查看您用于 JDK/JRE 的版本(您可以从目录中看出这一点,如果没有,则转到该目录并执行 java -version)。

您可能需要更新 eclipse 中的 java 版本。

【讨论】:

以上是关于用猪写一个 udf 有点像教程的主要内容,如果未能解决你的问题,请参考以下文章

这些老系统代码,是猪写的么?

用猪拉丁语解析 XML

一套 Spark UDF 实践教程(文末专栏抽奖)

IDEA下写hive的udf(踩坑教程)

除了 apache.org 教程之外,还有关于 Pig UDF 的有用教程吗?

如何在 Redshift 中创建自定义聚合 UDF 函数?