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 //.
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))
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())
}
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.
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
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
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.
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/").!!
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