2014-02-12 3 views
0

Я новичок в Pig latin и пытаюсь реализовать UDF, но получаю следующую ошибку.Ошибка ClassCastException при загрузке UDF в Pig Latin

Ошибка

[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 

Script

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

} 

Da те Файлы

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 generate 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 в пакет. во время работы он не показывает ошибки, но когда я 'dump' мой окончательный вывод, он показывает ошибку «за пределами», но иллюстрирует, что команда работает. – user3301448

0

Удовлетворительная проблема была в моих командах сценария, как я не проходил два входа, которые привели к ошибке «из доступа ограничивает во время acessing второго поля» HDFS

REGISTER»: //0.0.0.0: 8020 /user/training/pig/pow.jar ';

base = load 'hdfs: //0.0.0.0: 8020/user/training/pig/base' с использованием PigStorage (',') as (id: int, base: int);

exponent = load 'hdfs: //0.0.0.0: 8020/user/training/pig/exponents', используя PigStorage (',') как (id: int, exp: int);

tab = объединение базы по id, показатель по id;

tab2 = вкладка foreach генерирует $ 1 в качестве базы, $ 3 как exp;

fin = foreach tab2 генерировать abc.power (base, exp) как res;

свалка;

Final Java Code

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; 

    } 

}