2016-09-09 5 views
0

Ich weiß, ich kann dies tun:Hier finden Sie eine Liste von Unterverzeichnissen

data = sc.textFile('/hadoop_foo/a') 
data.count() 
240 
data = sc.textFile('/hadoop_foo/*') 
data.count() 
168129 

Allerdings würde Ich mag die Größe der Daten jedes Unterverzeichnis zählen von „/ hadoop_foo /“. Kann ich das machen?

Mit anderen Worten, was ich will, ist so etwas wie diese:

subdirectories = magicFunction() 
for subdir in subdirectories: 
    data sc.textFile(subdir) 
    data.count() 

ich versuchte:

In [9]: [x[0] for x in os.walk("/hadoop_foo/")] 
Out[9]: [] 

aber ich denke, das fehlschlägt, weil es auf dem lokalen Verzeichnis sucht des Treibers (in diesem Fall das Gateway), während "/ hadoop_foo /" in der liegt. Das gleiche gilt für "hdfs: /// hadoop_foo /".


Nach How can I list subdirectories recursively for HDFS? lesen, ich frage mich, ob es einen Weg gibt auszuführen ist:

hadoop dfs -lsr /hadoop_foo/ 

in Code ..


Von Correct way of writing two floats into a regular txt:

In [28]: os.getcwd() 
Out[28]: '/homes/gsamaras' <-- which is my local directory 

Antwort

1

Mit Python verwenden Sie hdfs Modul; walk() Methode können Sie eine Liste von Dateien erhalten. etwa wie folgt aussehen

Der Code sould:

from hdfs import InsecureClient 

client = InsecureClient('http://host:port', user='user') 
for stuff in client.walk(dir, 0, True): 
... 

Mit Scala Sie das Dateisystem bekommen (val fs = FileSystem.get(new Configuration())) und führen https://hadoop.apache.org/docs/r2.4.1/api/org/apache/hadoop/fs/FileSystem.html#listFiles(org.apache.hadoop.fs.Path, boolean)

Sie können auch einen Shell-Befehl von Ihrem Skript ausführen mit os.subprocess, aber dies ist nie ein empfohlener Ansatz, da Sie hier auf die Textausgabe eines Shell-Dienstprogramms angewiesen sind.


Schließlich arbeitet, was für die OP subprocess.check_output() wurde mit:

subdirectories = subprocess.check_output(["hadoop","fs","-ls", "/hadoop_foo/"]) 
+0

Ist der [tag: java] oder [tag: Python]? Ich benutze [tag: python]. Auch ist nicht klar was folgt, ein Link? Ich meine was ich genau in meinem Code machen soll? 'subprocess.call (["/hadoop_foo/"])' sagt, dass es die Hauptklasse 'dfs' nicht finden kann. Gleiches mit 'fs' anstelle von' dfs'. Ich habe auch "hadoop dfs" im 1. Teil ausprobiert und habe 'OSError: [Errno 2] Keine solche Datei oder Verzeichnis erhalten. – gsamaras

+0

Bearbeitete die Antwort, um Python-Möglichkeiten zum rekursiven Abrufen von Dateien bereitzustellen. – patrungel

+0

Ich sah es, danke. 'Kein Modul namens hdfs', ich bin verloren .. '_', aber +1 für die Bereitstellung von Optionen! Wenn Sie die Frage auffrischen möchten, um mehr Leute hierher zu bringen, kann das vielleicht helfen! :) – gsamaras

Verwandte Themen