2017-02-01 1 views
2

Comment convertir un fichier flatMap d'un fichier texte en format flatMap? Je dois compter les occurrences de chaque caractère d'un fichier texte. Quelle approche adopter après le code suivant?Nombre d'occurrences de caractères à partir du fichier texte en entrée

val words = readme.flatMap(line => line.split(" ")).collect() 
+0

Je parierai vous une pinte qui l'exécution de cette série à l'extérieur de Spark fonctionnera plus vite pour presque n'importe quelle taille d'entrée. Est-ce une mission? Et si vous ne faites que compter les personnages, pourquoi divisez-vous d'abord l'espace? –

Répondre

1

Afin de convertir chaque String en ses caractères représentant, vous avez besoin d'un flatMap supplémentaire:

val characters = lines.flatMap(_.split(" ")).flatMap(_.toCharArray) 

scala> val lines = Array("hello world", "yay more lines") 
lines: Array[String] = Array(hello world, yay more lines) 

scala> lines.flatMap(_.split(" ")).flatMap(_.toCharArray) 
res3: Array[Char] = Array(h, e, l, l, o, w, o, r, l, d, y, a, y, m, o, r, e, l, i, n, e, s) 

Bien que ce soit une console Scala, il fonctionnera de la même sur un RDD.

0

Si vous ne souhaitez que char « s alors je pense que vous voulez probablement compter spaces ' ' trop

val chars = readme.flatMap(line => line.toCharArray) 

// but if you dont want to count spaces too, 
// val chars = readme.flatMap(line => line.toCharArray.filter(_ != ' ')) 

val charsCount = chars 
    .map(c => (c, 1)) 
    .reduceByKey((i1: Int, i2: Int) => i1 + i2) 
0
val txt = a.getClass.getResourceAsStream("/a.txt") 
val txtFile = File.createTempFile("a", "txt") 
txtFile.deleteOnExit() 
ByteStreams.copy(txt, Files.newOutputStreamSupplier(txtFile)) 
val tokenized = sc.textFile(txtFile.toString).flatMap(_.split(' ')) 
val char = tokenized.flatMap(_.toCharArray)