3

私は豚が初めてで、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_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の問題のようなものですか?

4

1 に答える 1

5

jar のバージョンを確認するには、winzip (または同様のもの) を使用して jar を開き、manifest.mf を探します。「Created-By」という行があるはずです。これにより、jar のビルドに使用された Java のバージョンがわかります。

これは、アプリのビルドに使用している Java のバージョンよりも古いか、同じである必要があります。コマンド ラインでこれを行う場合は、次のように入力します。

java -version

または日食に行く

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

JDK/JRE に使用しているバージョンを確認します (ディレクトリからこれを確認できる場合があります。そうでない場合は、そのディレクトリに移動して java -version を実行します)。

Eclipse で使用している Java のバージョンを更新する必要がある可能性があります。

于 2012-11-12T16:49:09.937 に答える