2016-07-23 12 views
0

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"

  1. 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 
    
  2. 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%) 
    
  3. 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 
    
  4. 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

  1. 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] 
    
  2. 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?

+0

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. –

+0

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. –

+0

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. –

Antwort

0

ja mit IDE wie Eclipse ist einfach dann machen Glas aus CLI.

Erstellen von JAR-Datei von der Kommandozeile müssen Sie die folgenden Schritte aus:

Erstes make Projekt dirs unter Projektverzeichnis ch17-hive:

  • ist - speichert .class- (Strip.class) Dateien
  • lib - sie wird die externe Gläser erforderlich
  • traget - speichert Gläser, die Sie

    schaffen
    [ch17-hive]$ mkdir bin lib traget 
    [ch17-hive]$ ls 
    bin lib src target 
    

Kopie erforderliche externe Gläser zu ch170hive/lib dir:

[ch17-hive]$ cp /usr/lib/hive/lib/hive-exec.jar lib/. 
[ch17-hive]$ cp /usr/lib/hadoop/hadoop-common.jar lib/. 

Jetzt kompilieren Java von dir, aus dem Ihre Klasse com.hadoopbook.hive.Strip wohnt, seine in Ihrem Fall ch17-hive/src/main/java:

[java]$ pwd 
/home/cloudera/ch17-hive/src/main/java 
[java]$ javac -d ../../../bin -classpath ../../../lib/hive-exec.jar:../../../lib/hadoop-common.jar com/hadoopbook/hive/Strip.java 

Erstellen einer Menifestdatei a s:

[ch17-hive]$ cat MENIFEST.MF 
Main-Class: com.hadoopbook.hive.Strip 
Class-Path: lib/hadoop-common.jar lib/hive-exec.jar 

erstellen jar als

[ch17-hive]$ jar cvfm target/strip.jar MENIFEST.MF -C bin .added manifest 
adding: com/(in = 0) (out= 0)(stored 0%) 
adding: com/hadoopbook/(in = 0) (out= 0)(stored 0%) 
adding: com/hadoopbook/hive/(in = 0) (out= 0)(stored 0%) 
adding: com/hadoopbook/hive/Strip.class(in = 915) (out= 456)(deflated 50%) 

Jetzt sollten Sie Struktur projizieren wie folgt aussehen:

[ch17-hive]$ ls * 
MENIFEST.MF 

bin: 
com 

lib: 
hadoop-common.jar hive-exec.jar 

src: 
main 

target: 
strip.jar 

Kopie erstellt jar hdfs:

hadoop fs -put /home/cloudera/ch17-hive/target/strip.jar /user/cloudera/. 

Verwendung in HIVE:

hive> create function strip_new as 'com.hadoopbook.hive.Strip' using jar 'hdfs:/user/cloudera/strip.jar'; 
converting to local hdfs:/user/cloudera/strip.jar 
Added [/tmp/05a13d23-8051-431f-a354-793abac66160_resources/strip.jar] to class path 
Added resources: [hdfs:/user/cloudera/strip.jar] 
OK 
Time taken: 0.071 seconds 
hive> 
Verwandte Themen