2016-04-20 3 views
2

In dem folgenden Code, Jedes Mal, wenn Ausnahme abgefangen wird, würde Ich mag aus dem Programm beenden & die Ausnahme auf Shell druckenHive UDF mit Python - Print Ausnahme auf Shell

#stream.py 
import hashlib 
import sys 
import os 
import importlib 


for line in sys.stdin.readlines(): 
     try: 
      inpFile = "temp.py" 
      execfile(inpFile) 
      line1 = line.strip('\n').split('\t') 
      print "\t".join(line1) 
     except: 
      #exception expected "temp.py:File Not Found", how do I exit the code & print the exception on console ? 
      sys.exit(1) 

Hier ist die Abfrage-Transformation aufrufen die UDF:

erstellen Tabelle newtable als Select VERÄNDERN (id, name) 'python stream.py' als (id, name) von mytable weiter verwenden;

Ideen geschätzt.

Antwort

1

Wenn Sie eine bestimmte Ausnahme erwarten, sollten Sie das, nicht alles, was Sie tun. Aber es gibt nichts in Ihrem Code, um eine "Datei nicht gefunden" trotzdem zu generieren!

EDIT: Fragecode geändert! Wir möchten wirklich "alles" einfangen. Ich verwende Exception, die „fast“ alles einfängt, siehe https://docs.python.org/2/library/exceptions.html

Diese nutzt Python 2 Syntax:

import sys 
for line in sys.stdin.readlines(): 
    try:  
     inpFile = "temp.py" 
     execfile(inpFile) 
     line1 = line.strip('\n').split('\t') 
     print "\t".join(line1) 

    except Exception as err: 
     print >> sys.stderr, err # print to stderr (python 2 syntax) 
     sys.exit(1) 
+1

Ja, aber "Druck" würde einen Link druckt in der Tabelle würde zuzugreifen. Überprüfen Sie Bearbeiten in der Frage –

+0

Kein Glück, das obige Skript wirft Laufzeitausnahme "org.apache.hadoop.hive.ql.metadata.HiveException: [Fehler 20003]: Ein Fehler trat auf, wenn Sie versuchen, den Operator zu schließen, der Ihr benutzerdefiniertes Skript ausführt" . –

+1

Klingt so, als ob Sie 'sys.exit (1)' nicht in hadoop verwenden dürfen. Vielleicht wird diese Ausnahme ausgelöst, wenn Sie mit einem Fehler beenden - aber ich schätze. Ich habe keine Erfahrung mit Hadoop. Vielleicht solltest du auf die Konsole schreiben oder tty (abhängig vom Betriebssystem), die dein Shell-Programm benutzt. Ich nehme an, dass Sie das mit "Print extend on Shell" meinen. – cdarke

1

wenn Sie eine bestimmte Art von Ausnahme fangen wollen (für examle ein IOError) können Sie verwenden

except IOError as e: 

und Zugriff auf die Fehlerzeichenfolge mit e.strerror

wenn Sie alle Ausnahme fangen wollen, können Sie verwenden sys.exc_info()[0] Nachricht der letzten Fehler

zum Beispiel

try: 
    1/0 
except: 
    print sys.exc_info()[0] 

drucken

<type 'exceptions.ZeroDivisionError'> 
+0

Ja, aber "Drucken" würde einen Link in der Tabelle drucken. Überprüfen Sie bearbeiten in der Frage –

+1

richtig - wenn Sie die Fehlermeldung auf stderr ausgeben möchten, können Sie verwenden print ("Nachricht% s", sys.exc_info() [0], Datei = sys.stderr) –

+0

löst einen Syntaxfehler , Datei = sys.stderr Fehler in eine Datei schreiben? –