Ich habe folgende UDF in hive hinzuzufügen:kann nicht UDF hinzufügen in hive
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;
}
}
Dies ist ein Beispiel aus dem Buch "Hadoop: The Definitive Guide"
ich die erstellt
.class
Datei von oben Java-Datei mit dem folgenden Befehl:[email protected]:~/Hadoop-tutorial/hadoop-book-master/ch17-hive/src/main/java/com/hadoopbook/hive$ javac Strip.java
Dann habe ich die jAR-Datei u singen Sie den folgenden Befehl ein:
[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%)
Ich habe die geenrated jar-Datei zu hdfs Verzeichnis mit:
[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
ich ein UDF usign den folgenden Befehl zu erstellen versucht:
hive> create function strip as 'com.hadoopbook.hive.Strip' using jar 'hdfs://localhost/user/hduser/input/Strip.jar';
Aber ich habe einen Fehler wie folgt:
Umwandlung zu lokalen hdfs: //localhost/user/hduser/input/Strip.jar Added [/tmp/hduser_resources/Strip.jar] In den Klassenpfad hinzugefügt Ressourcen: [hdfs: // localhost/user /hduser/input/Strip.jar] Fehler bei der Registrierung default.strip mit der Klasse com.hadoopbook.hive.Strip FAILED: Ausführung Fehler, Rückgabecode 1 von org.apache.hadoop.hive.ql.exec.FunctionTask
Ich habe auch versucht, temporäre Funktion zu erstellen. So habe ich zuerst die JAR-Datei mit Hive:
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]
Dann habe ich versucht, die temporäre Funktion hinzuzufügen:
hive> create temporary function strip as 'com.hadoopbook.hive.Strip';
Aber ich habe folgende Fehlermeldung:
FEHLGESCHLAGEN: Klasse com.hadoopbook.hive.Strip nicht gefunden FAILED: Ausführung Fehler, Rückgabecode 1 von org.apache.hadoop.hive.ql.exec.FunctionTask
Die JAR-Datei wurde successully erstellt und hinzugefügt, um es zu hive.Still ist diese Klasse zeigt, wurde nicht gefunden. Kann mir bitte jemand sagen, was damit nicht stimmt?
warum Ihr jar Befehl 'Strip' hat? 'jar cvf Strip.jar Strip.class'. Können Sie versuchen, Ihr Jar als 'jar cvf Strip.jar Strip.class' zu erstellen und erneut auszuführen? Ich habe Jar mit Ihrem Programm von Eclipse gebaut und es hat gut funktioniert. –
Thanks.Creating Glas von Eclipse arbeitete. Aber das Erstellen mit dem Befehl jar cvf Strip.jar Strip.class funktioniert immer noch nicht. Es ist merkwürdig. –
Ja - siehe meine Antwort unten, wie man jar mit der richtigen Befehlszeile erstellt. - Bitte akzeptieren Sie dies als Antwort (make ist das richtige Zeichen grün unten), wenn Ihre Zweifel klar sind. –