J'ai un répertoire de répertoires sur HDFS et je souhaite parcourir les répertoires. Existe-t-il un moyen simple de faire cela avec Spark à l'aide de l'objet SparkContext?
Vous pouvez utiliser org.Apache.hadoop.fs.FileSystem
. Plus précisément, FileSystem.listFiles([path], true)
Et avec Spark ...
FileSystem.get(sc.hadoopConfiguration()).listFiles(..., true)
Modifier
Il convient de noter que la bonne pratique consiste à obtenir le paramètre FileSystem
associé au schéma Path
.
path.getFileSystem(sc.hadoopConfiguration).listFiles(path, true)
Voici la version de PySpark si quelqu'un est intéressé:
hadoop = sc._jvm.org.Apache.hadoop
fs = hadoop.fs.FileSystem
conf = hadoop.conf.Configuration()
path = hadoop.fs.Path('/hivewarehouse/disc_mrt.db/unified_fact/')
for f in fs.get(conf).listStatus(path):
print f.getPath()
Dans ce cas particulier, je reçois la liste de tous les fichiers qui composent la table Hive de disc_mrt.unified_fact.
D'autres méthodes d'objet FileStatus, telles que getLen () pour obtenir la taille du fichier, sont décrites ici:
import org.Apache.hadoop.fs.{FileSystem,Path}
FileSystem.get( sc.hadoopConfiguration ).listStatus( new Path("hdfs:///tmp")).foreach( x => println(x.getPath ))
Cela a fonctionné pour moi.
Spark version 1.5.0-cdh5.5.2
cela a fait le travail pour moi
FileSystem.get(new URI("hdfs://HAservice:9000"), sc.hadoopConfiguration).listStatus( new Path("/tmp/")).foreach( x => println(x.getPath ))
@Tagar n'a pas expliqué comment connecter des fichiers hdfs distants, mais cette réponse a:
URI = sc._gateway.jvm.Java.net.URI
Path = sc._gateway.jvm.org.Apache.hadoop.fs.Path
FileSystem = sc._gateway.jvm.org.Apache.hadoop.fs.FileSystem
Configuration = sc._gateway.jvm.org.Apache.hadoop.conf.Configuration
fs = FileSystem.get(URI("hdfs://somehost:8020"), Configuration())
status = fs.listStatus(Path('/some_dir/yet_another_one_dir/'))
for fileStatus in status:
print(fileStatus.getPath())
Vous pouvez aussi essayer avec le statut globStatus
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())
}