2014-11-19 13 views
16

Ho una directory di directory su HDFS e voglio scorrere le directory. C'è un modo semplice per farlo con Spark usando l'oggetto SparkContext?Spark iterate Directory HDFS

+0

vuoi dire 'iterare' come ottenere l'elenco di sub-directory e file all'interno? o ottenere tutti i file in tutte le sottodirectory? – maasg

+0

Iterare come in elenco tutte le sottodirectory. Ogni sottodirectory contiene un gruppo di file di testo che desidero elaborare in modi diversi. – Jon

risposta

30

È possibile utilizzare org.apache.hadoop.fs.FileSystem. In particolare, FileSystem.listFiles([path], true)

E con Spark ...

FileSystem.get(sc.hadoopConfiguration()).listFiles(..., true) 
+1

Perfetto, grazie. – Jon

+0

davvero bello! [Ho avuto questa domanda] (http://stackoverflow.com/questions/34738296/spark-spark-submit-jars-arguments-wants-comma-list-how-to-declare-a-directory/35550151#35550151), concesso, immagino che questo non funzionerebbe nella chiamata originale di spark-submit – JimLohse

+0

Come posso creare un elenco di file usando RemoteIterator che questo crea? – horatio1701d

5
import org.apache.hadoop.fs.{FileSystem,Path} 

FileSystem.get(sc.hadoopConfiguration).listStatus(new Path("hdfs:///tmp")).foreach(x => println(x.getPath)) 

questo ha funzionato per me.

Spark versione 1.5.0-cdh5.5.2

2

Si può provare con lo status globStatus così

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()) 
} 
4

Ecco versione PySpark se qualcuno è interessato:

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

In questo particolare caso ottengo l'elenco di tutti i file che compongono la tabella Hive disc_mrt.unified_fact.

Altri metodi di oggetto FileStatus, come getLen() per ottenere le dimensioni del file sono descritte qui:

Class FileStatus

Problemi correlati