【问题标题】:Not able to complete the word count program in spark using scala无法使用 scala 在 spark 中完成字数统计程序
【发布时间】:2016-06-07 12:18:37
【问题描述】:

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

谁能解释一下我的代码哪里出错了。

【问题讨论】:

  • 这必须用 Spark 完成吗?在 Scala 中还有其他普通方法可以做到这一点

标签: scala apache-spark


【解决方案1】:

我认为您的代码来自 Apache Spark 示例。要在纯 Scala 中进行字数统计,您可以使用 Seq 特征中的 groupByfold*

编辑: 我从您的评论中看到您确实在使用火花。然后你需要做的就是把你的数组变成一个RDD,它有reduceByKey。因此,您使用sc.paralellizeSeq 转换为RDD。然后你的代码就可以工作了。

【讨论】:

  • 是的。我正在从 spark-shell 尝试这个程序,所以如果我们即时提供输入,reduceByKey 不可用?
  • @SurenderRaja 我更新了我的答案,提供了如何让它在 Spark 中工作的信息
【解决方案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))
 }

并回答您的代码有什么问题:您使用的 reduceByKeymethod 对于您正在使用的集合不存在。

【讨论】:

  • 所以我们不能在普通的scala中使用reduceByKey吗?如果我想在普通 scala 中使用 reduceByKey,那么我需要调用什么集合?
  • 我想不出一个直接在普通 Scala 中实现 reduceByKey 方法的集合,但是通过 Seq 特征的链接方法,您可以轻松地重现它的行为。正如西蒙所说,尝试使用foldgroupBy
猜你喜欢
  • 1970-01-01
  • 2019-01-21
  • 2016-10-10
  • 1970-01-01
  • 1970-01-01
  • 2018-08-18
  • 2022-11-01
  • 2021-02-23
  • 1970-01-01
相关资源
最近更新 更多