Scala 入门 WordCount

来源:互联网 发布:阿里云 bd 待遇 编辑:程序博客网 时间:2024/06/03 14:10

此代码仅供学习参考,若有理解错误的地方请及时联系博主,谢谢。

package FileIOimport scala.io.Source;import scala.util.matching.Regexobject WordIO {  def main(args: Array[String]) {    val Sit = Source.fromFile("D://cc.txt").getLines()    // 文件读取,按行      val word = Sit.flatMap { line => line.split(" ") }    // 分离word    val wordregex = word.flatMap(str => stringregex(str))     val group = wordregex.foldLeft(Map.empty[String, Int]) {    // 向左折叠 def foldLeft[B](z: B)(op: (B, A) => B): B = {   A的类型其实就是调用这个函数的类型this.seq      (kv, str) => kv + (str -> (kv.getOrElse(str, 0) + 1))    // 初始化一个要得到的类型B(Map[String,Int]) 由A和B进过op,就是操作最终生成B(第一步是Empty的Map放入一个str和0+1,第二步传入的是第一步产生的Map及wordregex中第二个值,进行if else)    }    // map中的ifelse操作  Map[String,Int](也就是kv)中存在str则用str的值+1,若没有就用0+1              for(kv <-group){println(kv)}     }    def stringregex (str: String) : List[String] = {    val pattern = new Regex("[a-zA-Z]*['|’]?[a-zA-Z]*");    // 排除,."“” 但要保留’'等,使统计更精确    val string = (pattern findAllIn(str)).mkString("")    return List(string)      }}

对于flatLeft()函数的解释:

def foldLeft[B](z: B)(op: (B, A) => B): B = {      var result = z      this.seq foreach (x => result = op(result, x))      result    } 此方法接受2个参数,z和op,一个是B类型的参数,一个是返回B类型的函数。在看到这个trait其实是TraversableOnce,可迭代的集合。def seq: TraversableOnce[A]比如一个val listA = List(1,2,3)listA其实是实现了TraversableOnce这个trait的。我们可以直接使用:[java] view plain copyscala> listA.foldLeft(0)((sum,i)=>sum+i)  res26: Int = 6  这个里面的0其实就是z返回值是Int类型即B类型那么可以看出op这个函数返回值也需要是Int类型可以看出val result = z, 这里其实就是0,x=>result=op(result, x) , sum其实也是z其实z就是返回值,this.seq在这里就是list,对list遍历,这里执行op函数。这里我们执行的是sum+i,就是累加了1+2+3=6



对于getOrElse()函数的解释:

Map中的if()else()操作的变型在Spark中写法是:persons.getOrElse("Spark",1000) //如果persons这个Map中包含有Spark,取出它的值,如果没有,值就是1000。for循环访问persons里面的Key和valuefor((key,value)<- persons)println(key+":"+value)值:Hadoop:11Spark:6

函数参考来源:
http://blog.csdn.net/oopsoom/article/details/23447317?spm=5176.100239.blogcont32477.3.xMKWCN

http://www.cnblogs.com/supersom/p/5094666.html