【问题标题】:Count number of character occurrences from input text file计算输入文本文件中出现的字符数
【发布时间】:2017-06-18 01:50:52
【问题描述】:

如何将文本文件的 flatMap 转换为字符的 flatMap?我必须计算文本文件中每个字符的出现次数。遵循代码后采取什么方法?

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

【问题讨论】:

  • 我敢打赌,在 Spark 之外连续运行此程序对于几乎任何大小的输入都将运行得更快。这是作业吗?如果你只是计算字符,你为什么要先在空间上分割?

标签: scala apache-spark rdd flatmap bigdata


【解决方案1】:

为了将每个String 转换为其代表字符,您需要一个额外的flatMap

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)

虽然这是一个 Scala 控制台,但它在 RDD 上的工作方式相同。

【讨论】:

    【解决方案2】:

    如果你只对char感兴趣,那么我想你可能也想数spaces ' '

    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)
    

    【讨论】:

      【解决方案3】:
      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)
      

      【讨论】:

        猜你喜欢
        • 2010-12-08
        • 1970-01-01
        • 1970-01-01
        • 2014-04-26
        • 2013-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多