2015-10-28 11 views
14

Ich möchte alle Ordner in einem hdfs-Verzeichnis mit Scala/Spark auflisten. In Hadoop Ich kann dies tun, indem Sie den Befehl: hadoop fs -ls hdfs://sandbox.hortonworks.com/demo/Spark Scala Liste Ordner im Verzeichnis

Ich versuchte es mit:

val conf = new Configuration() 
val fs = FileSystem.get(new URI("hdfs://sandbox.hortonworks.com/"), conf) 

val path = new Path("hdfs://sandbox.hortonworks.com/demo/") 

val files = fs.listFiles(path, false) 

Aber es scheint nicht, dass er in dem Hadoop-Verzeichnis sieht aus, als ich nicht meine Ordner/Dateien finden.

Ich habe auch versucht mit:

FileSystem.get(sc.hadoopConfiguration).listFiles(new Path("hdfs://sandbox.hortonworks.com/demo/"), true) 

Aber das hilft uns auch nicht.

Haben Sie eine andere Idee?

PS: Ich habe auch diesen Thread überprüft: Spark iterate HDFS directory aber es funktioniert nicht für mich, da es nicht auf hdfs-Verzeichnis, sondern nur auf dem lokalen Dateisystem mit Schemadatei suchen sucht.

Antwort

20

Wir verwenden hadoop 1.4 und es hat keine listFiles-Methode, daher verwenden wir listStatus, um Verzeichnisse zu erhalten. Es hat keine rekursive Option, aber es ist einfach, rekursive Suche zu verwalten.

val fs = FileSystem.get(new Configuration()) 
val status = fs.listStatus(new Path(YOUR_HDFS_PATH)) 
status.foreach(x=> println(x.getPath)) 
+2

Vielen Dank, listStatus ist viel besser für die Ordner immer und funktioniert gut! In meinem Fall brauche ich keine rekursive Suche, das ist vollkommen in Ordnung. ** Ein Zusatz **: Wenn ich Ihre Codierung verwende, ist das Dateisystem Schema Datei: // und ich kann nicht hdfs: // als Schema verwenden. Also habe ich das Dateisystem auf diese Weise erstellt: 'val conf = new Konfiguration() val fs = FileSystem.get (neuer URI (" hdfs: //sandbox.hortonworks.com/ "), conf)'. Dann akzeptiert das Dateisystem hdfs: // Pfade. – AlexL

0

Weil Sie Scala verwenden, können Sie auch daran interessiert sein die folgenden:

import scala.sys.process._ 
val lsResult = Seq("hadoop","fs","-ls","hdfs://sandbox.hortonworks.com/demo/").!! 

Dies wird leider die gesamte Ausgabe des Befehls als String zurück, und so Parsen nach unten nur die Dateinamen erfordern etwas Aufwand. (Verwenden Sie stattdessen fs.listStatus.) Wenn Sie jedoch feststellen müssen, dass Sie andere Befehle ausführen müssen, die Sie in der Befehlszeile problemlos ausführen können, und Sie nicht sicher sind, wie Sie dies in Scala tun, verwenden Sie einfach die Befehlszeile über scala.sys.process._. (Verwenden Sie eine einziges ! wenn Sie wollen nur den Return-Code bekommen.)

3
val listStatus = org.apache.hadoop.fs.FileSystem.get(new URI(url), sc.hadoopConfiguration) 
.globStatus(new org.apache.hadoop.fs.Path(url)) 

    for (urlStatus <- listStatus) { 
    println("urlStatus get Path:" + urlStatus.getPath()) 

}

0

ich für das gleiche war auf der Suche, aber statt HDFS, für S3.

gelöst I wie unten das Filesystem mit meinem S3 Weg zu schaffen:

def getSubFolders(path: String)(implicit sparkContext: SparkContext): Seq[String] = { 
    val hadoopConf = sparkContext.hadoopConfiguration 
    val uri = new URI(path) 

    FileSystem.get(uri, hadoopConf).listStatus(new Path(path)).map { 
     _.getPath.toString 
    } 
    } 

Ich weiß, diese Frage für HDFS verwendet war, aber vielleicht andere wie ich kommen hier für S3-Lösung suchen. Da ohne Angabe des URI in FileSystem nach HDFS-Einsen gesucht wird.

java.lang.IllegalArgumentException: Wrong FS: s3://<bucket>/dummy_path 
expected: hdfs://<ip-machine>.eu-west-1.compute.internal:8020 
0
object HDFSProgram extends App {  
    val uri = new URI("hdfs://HOSTNAME:PORT")  
    val fs = FileSystem.get(uri,new Configuration())  
    val filePath = new Path("/user/hive/")  
    val status = fs.listStatus(filePath)  
    status.map(sts => sts.getPath).foreach(println)  
} 

Dieser Beispielcode ist die Liste von hdfs Dateien oder Ordner vorhanden unter/user/Bienenstock erhalten/

-2

Azure Blog Speicher ist mit einem HDFS kartiert, so dass alle Hadoop Operationen

auf Azure Portal, zu Storage-Konto gehen, Sie folgende Angaben finden:

  • Speicherkonto

  • Key -

  • Container -

  • Pfad Muster -/users/accountsdata/

  • Datumsformat - yyyy-mm-dd

  • Ereignis Serialisierung format - json

  • Für Matte - line

Pfad Muster hier ist die HDFS Pfad getrennt, können Sie sich einloggen/Kitt zum Hadoop Edge-Knoten und zu tun:

hadoop fs -ls /users/accountsdata 

Obiger Befehl alle Dateien auflistet. In Scala können Sie

import scala.sys.process._ 

val lsResult = Seq("hadoop","fs","-ls","https://stackoverflow.com/users/accountsdata/").!! 
+0

Bitte ignorieren Sie die Antwort - auf falschen Thread geschrieben !!! –

0
val spark = SparkSession.builder().appName("Demo").getOrCreate() 
val path = new Path("enter your directory path") 
val fs:FileSystem = projects.getFileSystem(spark.sparkContext.hadoopConfiguration) 
val it = fs.listLocatedStatus(path) 

verwenden Dies wird einen Iterator it über org.apache.hadoop.fs.LocatedFileStatus erstellen, die Ihr Unterverzeichnis ist