我在scala中做一些基本程序
我正在尝试在scala中使用单词计数程序
scala> val myWords = "HI HOW HI HOW ARE"
myWords: String = HI HOW HI HOW ARE
scala> val mySplit = myWords.split(" ")
mySplit: Array[String] = Array(HI, HOW, HI, HOW, ARE)
scala> val myMap = mySplit.map(x => (x,1))
myMap: Array[(String, Int)] = Array((HI,1), (HOW,1), (HI,1), (HOW,1), (ARE,1))
scala> val myCount = myMap.reduceByKey((a,b) => a+b)
<console>:16: error: value reduceByKey is not a member of Array[(String, Int)]
val myCount = myMap.reduceByKey((a,b) => a+b)
我不确定这个错误是什么意思?
所以我试图找到我可以用
调用的方法scala> val myCount = myMap.
apply asInstanceOf clone isInstanceOf length toString update
有人可以解释我在我的代码中出错的地方。
答案 0 :(得分:3)
我认为您的代码来自Apache Spark示例。要在普通Scala中执行wordcount,您可以使用groupBy
特征中的fold*
或Seq
。
修改强>
我从你的评论中看到你确实使用了火花。然后,您需要做的是将数组转换为RDD
,其中包含reduceByKey
。因此,您可以使用sc.paralellize
将Seq
变为RDD
。那么你的代码就可以了。
答案 1 :(得分:2)
计算单词的更“优雅”的解决方案:
val myWords = "HI HOW HI HOW ARE"
val mySplit = myWords.split(" ")
.foldLeft(Map.empty[String, Int]){
(count, word) => count + (word -> (count.getOrElse(word, 0) + 1))
}
要回答代码的错误:您使用的reduceByKey
方法对于您正在使用的集合不存在。