scala可能是那种让你写着写着就会去思考问题本质的语言,也因此越学越难,越学越觉得不会,所以如果只是写写spark或是搞搞mapreduce那完全可以和python那样用,刚开始接触还是不要去想太多吧。
scala中的wordcount(分割-》聚合-》统计)
"hello scala hello spark hello kafka"
.split(" ") ->分割
.groupBy(s=>s) ->聚合
.mapValues(_.length) -> 统计
res30: scala.collection.immutable.Map[String,Int] = Map(spark -> 1, scala -> 1, kafka -> 1, hello -> 3)
- 统计包含s的单词个数
"hello scala hello spark hello kafka"
.split(" ")
.groupBy(_.contains("s"))
.mapValues(_.length)
res31: scala.collection.immutable.Map[Boolean,Int] = Map(false -> 4, true -> 2)
- 统计spark开头的单词数
"hello scala hello spark hello kafka"
.split(" ")
.groupBy(_.startsWith("spark"))
.mapValues(_.length)
res32: scala.collection.immutable.Map[Boolean,Int] = Map(false -> 5, true -> 1)
- 遍历一次的wordcount
"hello scala hello spark hello kafka".split(" ")
.foldLeft(Map.empty[String,Int]){
(m,s) => if(m.contains(s)) m.updated(s,m.getOrElse(s,0) + 1) else m.updated(s,1)
}
res33: scala.collection.immutable.Map[String,Int] = Map(hello -> 3, scala -> 1, spark -> 1, kafka -> 1)
所以所谓wordcount,从数据类型上来讲,无非是String-》Map[String,Int]的转换,而思想上来讲就是分割-》聚合-》统计的过程,代码顺着思想写下去就行,所以scala写起来很顺畅,同时很简洁,比之python也不遑多让,另外这边的聚合是一个String=》map中的Key的演变过程,所以这边是可控的,也因此除了统计单词本身,我做一些上面的变形也非常简单,所以只要对问题本质理解,用scala会非常的简单,但也同时每个人的思想不同,写出来的scala代码也是各不相同的,这也是比较头疼的地方。
所以我感觉scala是一个充满思想的语言,懒得动脑筋还真的学不下去