scala版本wordcount的几种写法

    xiaoxiao2021-03-25  162

    今天看了下scala写的wordcount可以一行搞定,但是感觉有点费脑!

    写了几种方式:

    第一种:

    代码如下所示,其中先对list进行map操作并以空格切分,变成:list(list(“hello”,”world”),list(“word”,”count”),list(“hello”,”hello”,”lijie”),list(“lalala”,”lijie”)),然后对上面的list进行flatten(压扁)操作变成:list(hello,world, word,count, hello,hello,lijie, lalala,lijie),之后再进行map操作生成一个list并且里面放的元组:list((hello,1),(world,1), (word,1),(count,1), (hello,1),(hello,1),(lijie,1), (lalala,1),(lijie,1)),接着对上面元组list的第一个值进行分组(也就是对单词进行分组)groupBy: Map(count -> List((count,1)), world -> List((world,1)), lijie -> List((lijie,1), (lijie,1)), hello -> List((hello,1), (hello,1), (hello,1)), word -> List((word,1)), lalala -> List((lalala,1))),紧接着又做map操作并且传入一个匿名函数,其中t表示上面的单词名字和元组list的对偶元组,并返回一个key为单词名字,value为后面list的size的集合:Map(count -> 1, world -> 1, lijie -> 2, hello -> 3, word -> 1, lalala -> 1),最后转成list然后做排序等操作:List((hello,3), (lijie,2), (lalala,1), (word,1), (world,1), (count,1))

    //这个list模拟从文件读取的数据 val listWords = List("hello world", "word count", "hello hello lijie", "lalala lijie") //第一种方式 val w0 = listWords.map(_.split(" ")).flatten.map((_,1)).groupBy(_._1).map(t => (t._1,t._2.size)).toList.sortBy(_._2).reverse

    第二种:

    这里的flatMap就相当于上面先map然后再flatten,然后mapValues相当于对key-value形式的类型把它的value取出来做操作,然后key还是保持原来的key,其他的操作都一样

    //这个list模拟从文件读取的数据 val listWords = List("hello world", "word count", "hello hello lijie", "lalala lijie") //第二种方式 val w1 = listWords.flatMap(_.split(" ")).map((_,1)).groupBy(_._1).mapValues(_.size).toList.sortBy(_._2).reverse

    第三种:

    这种方式用了foldLeft,类似于hadoop中的map端的reduce(combiner),其中.foldLeft(0)(+._2)相当于对mapValues的(这里代表List,里面装的元组,例如list((hello,2),(hello,1)))的元组的单词数从0开始相加,后面的操作同上,如果list里面不是单独的(hello,1)而是有(hello,2)这种的时候用上面的size就行不通了,就可以用这种方法

    //这个list模拟从文件读取的数据 val listWords = List("hello world", "word count", "hello hello lijie", "lalala lijie") //第三种方式 val w2 = listWords.flatMap(_.split(" ")).map((_,1)).groupBy(_._1).mapValues(_.foldLeft(0)(_+_._2)).toList.sortBy(_._2).reverse

    其中上面三种方式最后打印出来都是一个结果:

    List((hello,3), (lijie,2), (lalala,1), (word,1), (world,1), (count,1))

    list.par

    //表示转换成并行集合 list.par

    aggregate方法:

    //聚合 aggregate 传递两个函数 //第一个下划线表示初始值,或者得到的中间值,第二个表示每个list的集合,后面的函数便是前面得到的值累加 val a = list(list(1,2,3),list(3,2),list(4,3)) a.aggregate(0)(_+_.sum,_+_)

    reduce方法

    //并行计算 list.par.reduce(_+_) //如果不是并行list reduce相当于reduceLeft list.reduce(_+_)相当于list.reduceLeft(_+_)

    foreach方法

    //只会把数组元素取出来应用到函数,不会像map一样还有个返回结果 foreach
    转载请注明原文地址: https://ju.6miu.com/read-8164.html

    最新回复(0)