2016-05-13 5 views
0

Ich habe eine Hive UDF, die gut in Hive-Terminal funktioniert, was ich will, ich möchte es über Shell-Skript ausführen. Auf hive Terminal ich in der Lage bin folgende Befehle auszuführen:hive udf Ausführung über Shell-Skript

use mashery_db; 
add jar hdfs://nameservice1/tmp/nextdata_aggregations/custom_jar/readerCheck.jar; 
add file hdfs://nameservice1/tmp/GeoLite2-City.mmdb; 
CREATE TEMPORARY FUNCTION geoip AS 'com.mashery.nextdata.hive.udf.GeoIPGenericUDF'; 

Aber wenn ich den obigen Code in Shell-Skript

hive -e "use mashery_db;" 
hive -e "add jar hdfs://nameservice1/tmp/nextdata_aggregations/custom_jar/readerCheck.jar;" 
hive -e "add file hdfs://nameservice1/tmp/GeoLite2-City.mmdb;" 
hive -e "CREATE TEMPORARY FUNCTION geoip AS 'com.mashery.nextdata.hive.udf.GeoIPGenericUDF';" 

Die erste ‚hive -e‘ funktioniert gut bin das Hinzufügen und fügt das Glas aber die letzte temporäre Funktion erstellen funktioniert nicht. Ich bin unten Störung zu erhalten:

FAILED: ParseException line 1:35 mismatched input 'com' expecting StringLiteral near 'AS' in create function statement 

Ich habe auch mit einfachen Anführungszeichen versucht

hive -e "CREATE TEMPORARY FUNCTION geoip AS 'com.mashery.nextdata.hive.udf.GeoIPGenericUDF';" 

dann erhalte ich FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.FunctionTask

FAILED: Class com.mashery.nextdata.hive.udf.GeoIPGenericUDF not found 

Hat hive Udf Shell-Skript unterstützt, wenn es tut was falsch mache ich. Vielen Dank im Voraus

+3

Versuchen Sie, das Glas zu importieren und die Funktion in einem Aufruf zu erstellen. d. h. 'hive -e" füge jar path_to_jar/foo.jar hinzu; erstelle temporäre Funktion foo als 'com.package.UDF'; " – gobrewers14

+0

@ GoBrewers14 danke, dass es bei mir funktioniert hat :-) –

Antwort

1

Jeder Aufruf von hive -e startet einen neuen Prozess mit einem neuen Stock-Shell, die keine Erinnerung von dem, was die vorherigen tat, so hive ‚vergisst‘, wo die UDF ist ... Eine Lösung ist der Kette sie in nur einem Befehl, aber es ist besser, alle Ihre Hive-Befehle in eine Datei (z. B. "commands.hql") zu setzen und stattdessen hive -f commands.hql von -e zu verwenden.

Datei würde wie folgt aussehen:

use mashery_db; 
add jar hdfs://nameservice1/tmp/nextdata_aggregations/custom_jar/readerCheck.jar; 
add file hdfs://nameservice1/tmp/GeoLite2-City.mmdb; 
CREATE TEMPORARY FUNCTION geoip AS 'com.mashery.nextdata.hive.udf.GeoIPGenericUDF';" 
0

Sie erhalten diese beiden arbeiten mit hive -e und hive -f:

hive -e "use mashery_db; 
add jar hdfs://nameservice1/tmp/nextdata_aggregations/custom_jar/readerCheck.jar; 
add file hdfs://nameservice1/tmp/GeoLite2-City.mmdb; 
CREATE TEMPORARY FUNCTION geoip AS 'com.mashery.nextdata.hive.udf.GeoIPGenericUDF';" 

als Datei erstellen und hive -f hive_file.hql Verwendung als gut funktionieren würde.