wordcount加强版和各种worldCount

背景

我们知道如果wordCount怎么做,无非是先split,然后map构造元组,再groupBy第一项,map新元组的第一项和第二项的长度,那么问题来了,我现在要连续两个分割

思路

其实这是典型的错位问题,思路也很简单,当时自己想复杂了,最简单的做法

object Test extends App {

  val source = Source.fromFile("world")
  val tmp = source.getLines().flatMap(_.split("\\W+")).toList
  (tmp.init zip tmp.tail).
    map(x ⇒ (x._1 + " " + x._2, 1))
    .groupBy(_._1).
    map(x ⇒ (x._1, x._2.length)).
    foreach(println)
}

用akkaStream应该怎么做wordcount

  val words = Source.fromIterator(() ⇒ FileSource.fromFile("/home/ctao/IdeaProjects/akkaStream/world.txt")
    .getLines().
    flatMap(line ⇒ line.split("\\W+")))

// words.runForeach(println)
  val count: Source[(String, Int), Unit] = words.map(_.toLowerCase).groupBy(20000, identity).fold("", 0) {
    case ((_, x), word) ⇒ (word, x + 1)
  }.mergeSubstreams

  count.runForeach(println).onComplete(_ ⇒ actorSystem.shutdown())

如果是Flink呢

    val env = ExecutionEnvironment.getExecutionEnvironment
    val source = env.readTextFile("/home/ctao/IdeaProjects/FlinkTest/world")
    source.flatMap { line ⇒ line.toLowerCase.split("\\W+") }.map {
      (_, 1)
    }.groupBy(0).sum(1).print()

其余闲聊

还有个比较有意思的问题
就是scala的特质线性继承问题,类似Object A extend App with B1 with B2,B1和B2里面都有同名方法,调用哪个的问题,为什么,类似

object Test extends App with Logger1 with Logger2 {

  override def log = super.log
  log
}


trait Logger1 {
  def log = println("log1")
}

trait Logger2 {
  def log = println("log2")
}

结果应是log2,这属于线性化的范畴,详细查看快学scala的130页

还有一个有意思的函数

grouped
看demo:

scala> Range(1,10).grouped(2).foreach(println)
Vector(1, 2)
Vector(3, 4)
Vector(5, 6)
Vector(7, 8)
Vector(9)
scala> Range(1,10).grouped(5).foreach(println)
Vector(1, 2, 3, 4, 5)
Vector(6, 7, 8, 9)

是不是很有意思

你可能感兴趣的:(scala)