web-dev-qa-db-fra.com

Liste des dossiers Spark Scala dans le répertoire

Je souhaite répertorier tous les dossiers d'un répertoire hdfs à l'aide de Scala/Spark . Dans Hadoop, je peux le faire à l'aide de la commande suivante: hadoop fs -ls hdfs://sandbox.hortonworks.com/demo/

Je l'ai essayé avec:

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)

Mais il ne semble pas qu'il cherche dans le répertoire Hadoop car je ne trouve pas mes dossiers/fichiers.

J'ai aussi essayé avec:

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

Mais cela n'aide pas non plus.

Avez-vous une autre idée?

PS: J'ai également vérifié ce fil de discussion: Spark iterate le répertoire HDFS mais cela ne fonctionne pas pour moi car il ne semble pas chercher dans le répertoire hdfs, mais uniquement sur le système de fichiers local avec le fichier de schéma //.

23
AlexL

Nous utilisons hadoop 1.4 et il n’a pas de méthode listFiles, nous utilisons donc listStatus pour obtenir des répertoires. Il n'a pas d'option récursive mais il est facile de gérer la recherche récursive.

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
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)

Cela créera un itérateur it sur org.Apache.hadoop.fs.LocatedFileStatus qui est votre sous-répertoire

1
Lejla
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)    
}

Ceci est un exemple de code pour obtenir la liste des fichiers hdfs ou du dossier présent dans/user/Hive /

0
Shan Hadoop Learner

Azure Blog Storage est mappé sur un emplacement HDFS, de sorte que toutes les opérations Hadoop 

Sur Portail Azure , allez à Compte de stockage, vous trouverez les détails suivants:

  • Compte de stockage 

  • Clé - 

  • Récipient - 

  • Modèle de chemin -/utilisateurs/accountsdata /

  • Format de date - aaaa-mm-jj

  • Format de sérialisation des événements - json

  • Format - ligne séparée

Le modèle de chemin ici est le chemin HDFS, vous pouvez vous connecter/PuTTY au noeud Hadoop Edge et faire:

hadoop fs -ls /users/accountsdata 

La commande ci-dessus listera tous les fichiers. En Scala, vous pouvez utiliser 

import scala.sys.process._ 

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

Je cherchais le même, cependant, au lieu deHDFS, pour S3 .

J'ai résolu la création du FileSystem avec mon chemin S3 comme ci-dessous:

  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
    }
  }

Je sais que cette question était liée à HDFS, mais peut-être que d'autres personnes comme moi viendront ici à la recherche d'une solution S3. Sans spécifier l'URI dans FileSystem, il recherchera ceux de HDFS.

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