2016-04-20 3 views
0

Ich versuche, einen sauberen Beenden des Programms immer wenn mein Python als Hive UDF mit einer Ausnahme fehlschlägt.
Hier ist ein Beispiel:Python als Hive UDF - Clean Beenden bei Ausnahme

SELECT TRANSFORM (id, name) USING 'D:\Python27\python.exe streaming.py' AS (id string, name string, count integer) FROM hivesampletable;

#streaming.py 
import sys 
from datetime import datetime 

try: 
    for line in sys.stdin.readlines(): 
     fields = line.strip().split('\t') 
     fields.append(len(name)) 
     print "\t".join(fields) 
except: 
    #I want program to break/clean exit with out printing (writing back) to table 

Ideen

geschätzt
+1

Sind Sie auf der Suche nach der 'Pass' Aussage – Spade

+0

Danke, können Sie bitte näher darauf eingehen? –

+1

Die Anweisung 'pass' lässt sich mit NOP vergleichen oder nichts tun. Eine populäre Anwendung davon ist in Ausnahmeblöcken, wo Sie eine bestimmte Art von Ausnahme ignorieren möchten. Es ist nicht die beste Vorgehensweise, Ihre Ausnahme beim Abfangen nicht explizit anzugeben, aber 'pass 'ermöglicht es Ihnen, ohne Unterbrechung den Steuerungsfluss wiederherzustellen. – Spade

Antwort

1

Wenn Sie im Wesentlichen die Ausnahme „schlucken“ wollen, dann würde ich in der except Block empfehlen Sie sys.exit(0) explizit aufrufen, denen beide Beenden Sie das Programm und geben Sie (von einer Shell-Ebene) an, dass das Programm "OK" ist.

z.B. Sie werden mit einem wirklich sauberen Ausgang enden, der sogar eine Schale, z.B. Bash, wird als "Erfolg" sehen.

Hinweis: Wenn Sie beenden möchten, ohne etwas zu drucken, aber eine Shell wissen lassen, dass etwas schief gegangen ist, übergeben Sie einen Fehlercode ungleich .

Antwort vom OP Kommentar:

Hmm, ich würde das nicht erwarten, da Sie die Ausnahme ausdrücklich sind schlucken ...

Der nächste Schritt auszudrucken wahrscheinlich wäre, was Die Ausnahme ist, wie in der anderen Antwort vorgeschlagen, und gehen von dort aus, je nachdem, was diese Ausnahme ist.

Eine andere Sache, die dazu beitragen kann, ist, ich glaube nicht, dass Ihr Python-Skript Ihre TRANSFORM-Anweisung entspricht, so dass dies zu dem Problem beitragen kann.

Sie verweisen auch name, ohne dass initialisiert wird (das könnte hier die Ausnahme sein - NameError: name 'name' is not defined).

+0

Sie bricht immer noch mit einer großen Laufzeit-Exception-Trace, aber nicht mit einem sauberen Exit. "Fehler: java.lang.RuntimeException: Hive Runtime Fehler beim Schließen von Operatoren" –

1

Mit der Pass-Anweisung können Sie den Fehler ignorieren und den Steuerungsfluss an Ihr Programm zurückgeben.

except Exception, e: 
    pass 
    #To see your exception 
    print str(e) 
    # Alternately, you could get details of your exception using 
    print sys.exc_info() 
+0

Es wird mit der nächsten Zeile des Streams fortgesetzt. Ich möchte, dass es nicht mehr dort streamt und aus dem Programm kommt –