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