wake-up-neo.net

Spark Scala-Listenordner im Verzeichnis

Ich möchte alle Ordner innerhalb eines HDFS-Verzeichnisses mit Scala/Spark ..__ auflisten. In Hadoop kann ich dies mit dem folgenden Befehl ausführen: hadoop fs -ls hdfs://sandbox.hortonworks.com/demo/

Ich habe es versucht 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 sieht nicht so aus, als würde er im Hadoop-Verzeichnis suchen, da ich meine Ordner/Dateien nicht finden kann.

Ich habe auch versucht mit:

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

Das hilft aber auch nicht.

Hast du noch eine andere Idee?

PS: Ich habe auch diesen Thread überprüft: Spark-HDFS-Verzeichnis durchlaufen aber es funktioniert nicht für mich, da es scheinbar nicht im hdfs-Verzeichnis zu suchen scheint, sondern nur im lokalen Dateisystem mit der Schemadatei //.

23
AlexL

Wir verwenden hadoop 1.4 und es gibt keine listFiles-Methode. Deshalb verwenden wir listStatus, um Verzeichnisse abzurufen. Es gibt keine rekursive Option, aber es ist einfach, die 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))
27
nil
   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())

}

2
Nitin

In Spark 2.0+,

import org.Apache.hadoop.fs.{FileSystem, Path}
val fs = FileSystem.get(spark.sparkContext.hadoopConfiguration)
fs.listStatus(new Path(s"${hdfs-path}")).filter(_.isDir).map(_.getPath).foreach(println)

Hoffe das ist hilfreich.

1
Ajay Ahuja
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)

Dadurch wird ein Iterator it über org.Apache.hadoop.fs.LocatedFileStatus erstellt, der Ihr Unterverzeichnis ist

1
Lejla

in Ajay Ahujas Antwort isDir ist veraltet ..

benutze isDirectory...

package examples

    import org.Apache.log4j.Level
    import org.Apache.spark.sql.SparkSession

    object ListHDFSDirectories  extends  App{
      val logger = org.Apache.log4j.Logger.getLogger("org")
      logger.setLevel(Level.WARN)
      val spark = SparkSession.builder()
        .appName(this.getClass.getName)
        .config("spark.master", "local[*]").getOrCreate()

      val hdfspath = "." // your path here
      import org.Apache.hadoop.fs.{FileSystem, Path}
      val fs = org.Apache.hadoop.fs.FileSystem.get(spark.sparkContext.hadoopConfiguration)
      fs.listStatus(new Path(s"${hdfspath}")).filter(_.isDirectory).map(_.getPath).foreach(println)
    }

Ergebnis:

file:/Users/user/codebase/myproject/target
file:/Users/user/codebase/myproject/Rel
file:/Users/user/codebase/myproject/spark-warehouse
file:/Users/user/codebase/myproject/metastore_db
file:/Users/user/codebase/myproject/.idea
file:/Users/user/codebase/myproject/src
1
user3190018
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)    
}

Dies ist ein Beispielcode, um eine Liste der HDFS-Dateien oder des Ordners unter/user/Hive/abzurufen.

0

Azure Blog Storage ist einem HDFS-Speicherort zugeordnet, also allen Hadoop-Vorgängen 

Auf Azure Portal gehen Sie zum Speicherkonto. Dort finden Sie folgende Informationen:

  • Speicherkonto 

  • Schlüssel - 

  • Behälter - 

  • Pfadmuster -/Benutzer/Kontodaten /

  • Datumsformat - JJJJ-MM-TT

  • Event-Serialisierungsformat - Json

  • Format - Zeile getrennt

Pfadmuster Hier ist der HDFS-Pfad. Sie können sich/PuTTY am Hadoop Edge-Knoten anmelden und Folgendes tun:

hadoop fs -ls /users/accountsdata 

Der obige Befehl listet alle Dateien auf. In Scala kannst du verwenden 

import scala.sys.process._ 

val lsResult = Seq("hadoop","fs","-ls","/users/accountsdata/").!!
0
Yogesh_JavaJ2EE

Ich suchte das gleiche, jedoch anstelle vonHDFS, für S3 .

Ich habe das Erstellen des Dateisystems mit meinem S3-Pfad wie folgt gelöst:

  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ß, dass diese Frage für HDFS relevant war, aber vielleicht kommen andere wie ich hierher und suchen nach einer S3-Lösung. Da ohne Angabe der URI in FileSystem nach HDFS-URI gesucht wird.

Java.lang.IllegalArgumentException: Wrong FS: s3://<bucket>/dummy_path
expected: hdfs://<ip-machine>.eu-west-1.compute.internal:8020
0
Franzi