Я должен добавить следующую UDF в улье:Невозможно добавить UDF в улей
package com.hadoopbook.hive;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
public class Strip extends UDF {
private Text result = new Text();
public Text evaluate(Text str) {
if (str == null) {
return null;
}
result.set(StringUtils.strip(str.toString()));
return result;
}
public Text evaluate(Text str, String stripChars) {
if (str == null) {
return null;
}
result.set(StringUtils.strip(str.toString(), stripChars));
return result;
}
}
Это пример из книги "Hadoop: The Definitive Guide"
Я создал
.class
файл выше Java-файл с помощью следующей команды:[email protected]:~/Hadoop-tutorial/hadoop-book-master/ch17-hive/src/main/java/com/hadoopbook/hive$ javac Strip.java
Затем я создал файл банки у петь следующую команду:
[email protected]:~/Hadoop-tutorial/hadoop-book-master/ch17-hive/src/main/java/com/hadoopbook/hive$ jar cvf Strip.jar Strip Strip.class Strip : no such file or directory added manifest adding: Strip.class(in = 915) (out= 457)(deflated 50%)
Я добавил geenrated файл банку в каталог HDFS с:
[email protected]:~/Hadoop-tutorial/hadoop-book-master/ch17-hive/src/main/java/com/hadoopbook/hive$ hadoop dfs -copyFromLocal /home/hduser/Hadoop-tutorial/hadoop-book-master/ch17-hive/src/main/java/com/hadoopbook/hive/Strip.jar /user/hduser/input
Я попытался создать UDF usign следующую команду:
hive> create function strip as 'com.hadoopbook.hive.Strip' using jar 'hdfs://localhost/user/hduser/input/Strip.jar';
Но я получил ошибку:
преобразование местного HDFS: //localhost/user/hduser/input/Strip.jar Добавлены [/tmp/hduser_resources/Strip.jar] на пути класса Дополнительных ресурсы: [HDFS: // локальных/пользователя /hduser/input/Strip.jar] Не удалось зарегистрировать default.strip с помощью класса com.hadoopbook.hive.Strip FAILED: Выполнение Ошибка, код возврата 1 из org.apache.hadoop.hive.ql.exec.FunctionTask
Я также попытался создать временную функцию. Так я первый добавил файл банку в улей с помощью:
hive> add jar hdfs://localhost/user/hduser/input/Strip.jar; converting to local hdfs://localhost/user/hduser/input/Strip.jar Added [/tmp/hduser_resources/Strip.jar] to class path Added resources: [hdfs://localhost/user/hduser/input/Strip.jar]
Затем я попытался добавить временную функцию:
hive> create temporary function strip as 'com.hadoopbook.hive.Strip';
Но я получил следующее сообщение об ошибке:
FAILED: Класс com.hadoopbook.hive.Strip не найден FAILED: Выполнение Ошибка, код возврата 1 из org.apache.hadoop.hive.ql.exec.FunctionTask
Файл jar был успешно создан и добавлен в hive.Still показывается, что класс не найден. Может ли кто-нибудь рассказать, что с ним не так?
почему ваша команда баночка имеет 'Strip'? 'jar cvf Strip.jar Strip Strip.class'. можете ли вы попытаться создать свою банку как 'jar cvf Strip.jar Strip.class' и повторно запустить? Я построил банку, используя вашу программу из eclipse, и она отлично работала. –
Спасибо.Создание jar из eclipse. Но создание с помощью jar cvf Strip.jar Strip.class еще не работает. Это странно. –
yes - см. Мой ответ ниже о том, как создать банку, используя правильную линию командной строки. - любезно принять это как ответ (сделайте правильный знак зеленый ниже), если ваши сомнения ясны. –