Я новичок в свинье. Я написал 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 - мое имя класса
Прежде чем компилировать ваш 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);
В сообщении об ошибке говорится, что 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);