2014-02-12 64 views
0

我是Pig latin的新手,嘗試實現UDF但出現跟隨錯誤。在豬拉丁文中加載UDF時出現ClassCastException錯誤

錯誤

[main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1200: Pig script failed to parse: 
<line 5, column 28> Failed to generate logical plan. Nested exception: java.lang.ClassCastException: power cannot be cast to org.apache.pig.EvalFunc 
Details at logfile: /home/training/pig_1392253062989.log 

腳本

REGISTER 'hdfs://cloudera-vm:8020/user/training/pig/pow.jar'; 

base = load 'hdfs://cloudera-vm:8020/user/training/pig/base' using PigStorage(',') as (id:int,base:int); 

exponent = load 'hdfs://cloudera-vm:8020/user/training/pig/exponents' using 
PigStorage(',') as (id:int,exp:int); 

tab = join base by id, exponent by id; 

tab2 = foreach tab generate $1 as base, $3 as exp; 

fin = foreach tab2 generate power(tab2.$0,tab2.$1); 

UDF

import java.io.IOException; 

import org.apache.pig.EvalFunc; 
import org.apache.pig.data.Tuple; 


public class power extends EvalFunc<Integer> 
{ 

    public Integer exec(Tuple arg0) throws IOException { 
     int base = (Integer)arg0.get(0); 
     int exponent = (Integer)arg0.get(1); 
     int result=1; 

     for(int i=1;i<=exponent;i++) 
      result=result*base; 

     return result; 
    } 

} 

大TA文件

Base 

1,2  
2,3 
3,4  
4,5 
5,6 
6,7 
7,8 
8,9 
9,10 

exponents 

1,2 
2,3 
3,3 
4,4 
5,2 
6,5 
7,7 
8,4 
9,5 
+0

前綴的UDF調用與罐子名。 pow.power(tab2。$ 0,tab2。$ 1) – Chiron

+0

仍然不工作 fin = foreach tab2生成pow.power(tab2。$ 0,tab2。$ 1); 2014-02-12 21:23:57,634 [main] ERROR org.apache.pig.tools.grunt.Grunt - 錯誤1070:無法使用導入來解析pow.power:[,org.apache.pig.builtin 。,org.apache.pig.impl.builtin。] 日誌文件的詳細信息:/home/training/pig_1392258175870.log – user3301448

+0

您檢查了/home/training/pig_1392258175870.log? – Chiron

回答

0

如果你的目標是計算tab2.$0^tab2.$1,你可能要考慮使用內置POW。否則,如果你真的想使用你自己的UDF,我會建議把這個類放入包中,在你的PIG腳本中使用完全限定的名字,並檢查你的類路徑。您的類路徑中可能有錯誤的類pow

+0

我這樣做,並把我的UDF放在一個包裏。而運行它顯示沒有錯誤,但是當我'轉儲'我的最終輸出它顯示「出界」的錯誤,但說明命令正在工作。 – user3301448

0

奧凱的問題是在我的腳本命令,因爲我沒有通過,導致「出界訪問,同時acessing第二場」

寄存器HDFS的錯誤兩個輸入://0.0.0.0:8020 /user/training/pig/pow.jar'; PigStorage(',')as(id:int,base:int);使用PigStorage(',')base = load'hdfs://0.0.0.0:8020/user/training/pig/base'。使用PigStorage(',')as(id:int,exp:int);指數= load'hdfs://0.0.0.0:8020/user/training/pig/exponents'。

tab =通過id連接基數,通過id指數;

tab2 = foreach tab生成$ 1爲基數,$ 3爲exp;

fin = foreach tab2生成abc.power(base,exp)as res;

轉儲鰭;

最終Java代碼的

enter code here

package abc; 

import java.io.IOException; 

import org.apache.pig.EvalFunc; 
import org.apache.pig.data.Tuple; 
import org.apache.pig.data.TupleFactory; 


public class power extends EvalFunc<Tuple> { 

    public Tuple exec(Tuple input) throws IOException { 

     int base = (Integer)input.get(0); 
     int exponent = (Integer)input.get(1); 
     double result=1.0; 
     Tuple out = TupleFactory.getInstance().newTuple(3); 

     for(int i=1;i<=exponent;i++) 
       {result=result*base;} 
     out.set(0, input.get(0)); 
     out.set(1, input.get(1)); 
     out.set(2, result); 

     return out; 

    } 

}