Ошибка в Udf свиньи

1

Я новичок в свинье. Я написал UDF у свиньи и использовал его в своем сценарии свиней. Но он дает следующую ошибку

ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1070: Could not resolve UserDefined.PartsOfSpeech using imports: [, java.lang., org.apache.pig.builtin., org.apache.pig.impl.builtin.]

Вот мой код UDF

    public String exec(Tuple input) throws IOException {
       //my code here
    }

Вот мой свиной скрипт

REGISTER /home/bigdata/NetBeansProjects/UserDefined/dist/UserDefined.jar         
 a = load '/user/bigdata/json' using TextLoader() as (input:chararray);            
 b = foreach a GENERATE UserDefined.PartsOfSpeech(input);

В приведенном выше коде UserDefined - это имя моего пакета, а PartOfSpeech - мое имя класса

Теги:
apache-pig

2 ответа

0

Прежде чем компилировать ваш UDF (класс java), убедитесь, что вы указали название пакета правильно. например, если вы упомянули пакет name-

пакет com.pig.udf;

Это означает, что вам нужно позаботиться о каталоге в вашем linux-окне.

вы можете следовать нижеуказанным шагам, чтобы создать банку -

Создать каталог, используя

mkdir -p com/pig/udf

Создайте свой Java-класс с пакетом com.pig.udf

Скомпилируйте исходный код Java с помощью команды

javac -cp /usr/lib/pig-0.12.0.2.0.6.0-76.jar YourClass.java

Затем перейдите в каталог, где вы хотите создать банку сейчас -

cd ../../..

Теперь создайте банку, используя команду ниже

jar -cvf yourJarName.jar com/

Зарегистрируйте банку в своем скрипте, используя ключевое слово "register", а затем путь к jar. Теперь используйте свою банку с ключевым словом com.pig.udf.YourJavaClassName для вашего scenerio -

REGISTER /home/bigdata/NetBeansProjects/UserDefined/dist/UserDefined.jar         
a = load '/user/bigdata/json' using TextLoader() as (input:chararray);            
b = foreach a GENERATE com.pig.udf.PartsOfSpeech(input);
0

В сообщении об ошибке говорится, что Pig не может найти UserDefined.PartsOfSpeech.

Какая декларация package содержит PartOfSpeech.java в верхней части файла?

Если объявлением package com.my.company; является package com.my.company; попробуйте это вместо этого:

REGISTER /home/bigdata/NetBeansProjects/UserDefined/dist/UserDefined.jar         
a = load '/user/bigdata/json' using TextLoader() as (input:chararray);            
b = foreach a GENERATE com.my.company.PartsOfSpeech(input);

То есть, замените UserDefined.PartsOfSpeech(input) на com.my.company.PartsOfSpeech(input) так как UDF находится в пакете com.my.company.

Кроме того, подумайте о том, чтобы использовать ключевое слово DEFINE в сценарии Pig, поэтому вам не нужно повторять com.my.company каждый раз, когда вы используете PartsOfSpeech.

DEFINE PartsOfSpeech UserDefined.dist.PartsOfSpeech();
REGISTER /home/bigdata/NetBeansProjects/UserDefined/dist/UserDefined.jar         
a = load '/user/bigdata/json' using TextLoader() as (input:chararray);            
b = foreach a GENERATE PartsOfSpeech(input);

Более подробная информация о DEFINE в главе 5 "Свинья программирования" Алана Гейтса: http://chimera.labs.oreilly.com/books/1234000001811/ch05.html#udf_define.

Вот пример DEFINE из книги Гейтса:

--define.pig
register 'your_path_to_piggybank/piggybank.jar';
define reverse org.apache.pig.piggybank.evaluation.string.Reverse();
divs      = load 'NYSE_dividends' as (exchange:chararray, symbol:chararray,
            date:chararray, dividends:float);
backwards = foreach divs generate reverse(symbol);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню