2015-09-01 30 views
6

Ich möchte überprüfen, ob mehrere Dateien in hdfs vorhanden sind, bevor sie von SparkContext geladen werden. Ich benutze pyspark. Ich habe versucht os.system("hadoop fs -test -e %s" %path) aber da ich eine Menge Pfade zu überprüfen haben, stürzte der Job. Ich habe auch versucht sc.wholeTextFiles(parent_path) und dann nach Schlüsseln zu filtern. aber es stürzte auch ab, weil der parent_path viele Unterpfade und Dateien enthält. Können Sie mir helfen?pyspark: Wie überprüft man, ob eine Datei in hdfs existiert

Antwort

1

Rigth, wie es sagt Tristan Reid:

... (Funke) Es hat viele Formate lesen können, und es unterstützt Hadoop glob Ausdrücke, die von mehreren Pfaden in HDFS zum Lesen besonders nützlich sind, aber es doesn Ich habe keine eingebaute Einrichtung, die mir zum Durchlaufen von Verzeichnissen oder Dateien bekannt ist, und auch keine speziellen Funktionen für die Interaktion mit Hadoop oder HDFS.

Wie auch immer, dies ist seine Antwort auf eine ähnliche Frage: Pyspark: get list of files/directories on HDFS path

Sobald Sie die Liste der Dateien in einem Verzeichnis haben, ist es einfach zu überprüfen, ob eine bestimmte Datei vorhanden ist.

Ich hoffe, es kann irgendwie helfen.

0

Haben Sie versucht, pydoop zu verwenden? Die exists Funktion sollte funktionieren

0

Eine Möglichkeit ist, dass Sie hadoop fs -lsr your_path verwenden können, um alle Pfade zu erhalten, und dann überprüfen, ob die Pfade, die Sie interessiert sind, in diesem Satz sind.

In Bezug auf Ihren Absturz ist es möglich, dass es ein Ergebnis aller Aufrufe an os.system war, anstatt für den Hadoop-Befehl spezifisch zu sein. Manchmal kann das Aufrufen eines externen Prozesses zu Problemen führen, die sich auf Puffer beziehen, die niemals freigegeben werden, insbesondere auf E/A-Puffer (stdin/stdout).

Eine Lösung wäre, einen einzigen Aufruf an ein Bash-Skript zu machen, das alle Pfade durchläuft. Sie können das Skript mithilfe einer Zeichenfolgenvorlage in Ihrem Code erstellen, das Array der Pfade im Skript ausfüllen, es schreiben und dann ausführen.

Es kann auch eine gute Idee sein, zum subprocess Modul von Python zu wechseln, das Ihnen granularere Kontrolle über das Behandeln von Unterprozessen gibt. Hier ist das Äquivalent von os.system:

process = subprocess.check_output(
     args=your_script, 
     stdout=PIPE, 
     shell=True 
    ) 

Beachten Sie, dass stdout zu so etwas wie ein Datei-Handle wechseln, wenn, dass Sie mit Debugging hilft oder was das Verfahren robuster. Sie können auch das Argument shell=True zu False wechseln, es sei denn, Sie werden ein tatsächliches Skript aufrufen oder Shell-spezifische Dinge wie Pipes oder Umleitung verwenden.

Verwandte Themen