Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Spark和Scala进行字数统计_Scala_Apache Spark - Fatal编程技术网

使用Spark和Scala进行字数统计

使用Spark和Scala进行字数统计,scala,apache-spark,Scala,Apache Spark,我必须用Scala编写一个程序,使用spark计算一个单词在文本中出现的次数,但是使用RDD我的变量计数总是在末尾显示0。你能帮我吗? 这是我的密码 import scala.io.Source import org.apache.spark.SparkContext import org.apache.spark.SparkContext._ import org.apache.spark.SparkConf object wordcount { def main(args: Arr

我必须用Scala编写一个程序,使用spark计算一个单词在文本中出现的次数,但是使用RDD我的变量计数总是在末尾显示0。你能帮我吗? 这是我的密码

import scala.io.Source
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf

object wordcount {
    def main(args: Array[String]) {
      // set spark context
      val conf = new SparkConf().setAppName("wordcount").setMaster("local[*]")
      val sc = new SparkContext(conf)

      val distFile = sc.textFile("bible.txt")

      print("Enter word to loook for in the HOLY BILE: ")
      val word = Console.readLine
      var count = 0;
      println("You entered " + word)

      for (bib <- distFile.flatMap(_.split(" "))) {

        if (word==bib) {
            count += 1

        }

      }  
      println(word + " occours " + count + " times in the HOLY BIBLE!")
    }
}
导入scala.io.Source
导入org.apache.spark.SparkContext
导入org.apache.spark.SparkContext_
导入org.apache.spark.SparkConf
对象字数{
def main(参数:数组[字符串]){
//设置火花上下文
val conf=new SparkConf().setAppName(“wordcount”).setMaster(“local[*]”)
val sc=新的SparkContext(配置)
val distFile=sc.textFile(“bible.txt”)
打印(“在神圣的胆汁中输入单词:”)
val word=Console.readLine
var计数=0;
println(“您输入的”+单词)

对于(bib问题在于,您在分布式集合上使用可变变量。在正常情况下,这很难控制,尤其是在Spark中,变量会单独复制到每个工作者。因此,他们最终会得到自己版本的
count
变量,而原始变量实际上从未更新。您需要使用,这只适用于行动。综上所述,您可以在没有变量或累加器的情况下实现这一点:

val splitData = distFile.flatMap(_.split(" "))
val finalCount = splitData.aggregate(0)(
  (accum, word) => if(word == bib) accum + 1 else accum,
  _ + _)

这样做的目的是首先将计数设定为0。然后,第一个操作是将在每个分区上运行的操作。
acum
是累计计数,
word
是要比较的当前字。第二个操作只是用于将所有分区的
count
相加的组合器。

bib我建议您在RDD中使用可用的转换,而不是使用您自己的程序(尽管它没有害处)来获得所需的结果,例如,可以使用以下代码来检索字数

val word = Console.readLine
println("You entered " + word)
val input = sc.textFile("bible.txt")
val splitedLines = input.flatMap(line => line.split(" "))
                    .filter(x => x.equals(word))

System.out.println(splitedLines.count())
有关Spark内部的更多信息,请参阅本手册

val textFile = sc.textFile("demoscala.txt")
val counts = textFile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey(_ + _)
counts.saveAsTextFile("WordCountSpark")  
如果有人对(u)感到困惑,请在下面写一篇好博客


如果数据太大而无法收集到驱动程序上,该怎么办?这并不能从大数据的角度解决这个问题。它只是把它变成了单线程、单机器的问题。我必须把代码放在哪里?在for中?顺便说一句,谢谢你的回答。你将完全摆脱for,把它放在它的位置上。只有beca被否决使用for块将导致一个
foreach
,因此声明没有调用任何操作是不正确的。@Justin Pihony,我知道你是对的,所以我删除了关于RDD操作的评论。谢谢你指出这一点。我还有一个问题。我制作了程序的JAR,我想在google云平台的spark over hadoop中运行它当我单独在spark Stan的本地播放时,我不会发现ClassNotFound的错误。你能帮我吗?谢谢…解释你的解决方案会很有帮助
val textFile = sc.textFile("demoscala.txt")
val counts = textFile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey(_ + _)
counts.saveAsTextFile("WordCountSpark")  
val text=sc.textfile("filename.txt")

val counts=text.flatmap(line=>line.split("")).map(word=>(word,1)).reduceByKey(_+_) counts.collect