无法使用scala在spark中完成单词计数程序

时间:2016-06-07 12:18:37

标签: scala apache-spark

我在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

有人可以解释我在我的代码中出错的地方。

2 个答案:

答案 0 :(得分:3)

我认为您的代码来自Apache Spark示例。要在普通Scala中执行wordcount,您可以使用groupBy特征中的fold*Seq

修改 我从你的评论中看到你确实使用了火花。然后,您需要做的是将数组转换为RDD,其中包含reduceByKey。因此,您可以使用sc.paralellizeSeq变为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方法对于您正在使用的集合不存在。