2014-04-28 12 views
11

Voglio scorrere tutti i file di testo in una directory Hadoop e contare tutte le occorrenze della parola "errore". C'è un modo per fare un hadoop fs -ls /users/ubuntu/ per elencare tutti i file in una directory con l'API di Apache Spark Scala?Usa Spark per elencare tutti i file in una directory Hadoop HDFS?

Dalla data first example, il contesto scintilla sembra solo di accedere ai file singolarmente attraverso qualcosa di simile:

val file = spark.textFile("hdfs://target_load_file.txt") 

Nel mio problema, io non so quanti né i nomi dei file nella cartella HDFS anticipo . Ho visto il spark context docs ma non ho trovato questo tipo di funzionalità.

risposta

14

È possibile utilizzare un carattere jolly:

val errorCount = sc.textFile("hdfs://some-directory/*") 
        .flatMap(_.split(" ")).filter(_ == "error").count 
+0

E se volessi segnalare il nome del file in cui si è verificato l'errore? –

+2

Usa 'sc.wholeTextFiles'. Vedi http://stackoverflow.com/questions/29521665/how-to-map-filenames-to-rdd-using-sc-textfiles3n-bucket-csv per quasi tutta questa domanda. –

1
import org.apache.hadoop.fs.{FileSystem, FileUtil, Path} 
import scala.collection.mutable.Stack 


val fs = FileSystem.get(sc.hadoopConfiguration) 
var dirs = Stack[String]() 
val files = scala.collection.mutable.ListBuffer.empty[String] 
val fs = FileSystem.get(sc.hadoopConfiguration) 

dirs.push("/user/username/") 

while(!dirs.isEmpty){ 
    val status = fs.listStatus(new Path(dirs.pop())) 
    status.foreach(x=> if(x.isDirectory) dirs.push(x.getPath.toString) else 
    files+= x.getPath.toString) 
} 
files.foreach(println) 
Problemi correlati