在Pig中编写UDF教程

3

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

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

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

 user_id, movie_id, date_time_stamp

所以我试图做的是这样的。如果交易在

两个时间戳之间完成,那么...
    9 am and 11 am --> breakfast
    and so on

所以这是我的Pig脚本。
     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问题吗?

1
“Unsupported version” 通常意味着您的 jar 和 jdk 版本不兼容。这在 SO 上已经被问了很多次,包括此处 https://dev59.com/Cmw05IYBdhLWcg3wcReu. - Dave Richardson
@DaveRlz:感谢您给了我提示。我也是Java的新手,因此不知道这个。我该如何找到jar和jdk的版本?如何使它们兼容?我正在Windows上使用标准的Eclipse。 - frazman
1个回答

5

要查找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版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接