Scala编写WordCount

本文对比了两种Scala代码实现方式,一种是基于数组和HashMap的传统方法,另一种是利用Spark进行大规模数据处理的高效方案。通过代码示例,详细解释了flatMap、reduceByKey、sortByKey等函数的应用,展示了如何使用Spark进行数据统计、分组和排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自己编写的拙劣的代码

object WordCount extends App {

  val file = Source.fromFile("D:/data.txt")
  var words: String = ""
  var wordArray = new ArrayBuffer[String]()
//把行连成字符串
  for (f <- file.getLines()) {
    words += f + "\t"
  }
  var wordMap = mutable.HashMap[String, Int]()
  //变成数组
  wordArray = splitWord(words)
  //变成map,value值为0
  wordArray.map(x => wordMap += (x -> 0))
  //统计数组中各元素出现的次数,map中已经有所有元素各一份了(value为0)
  for (i<-wordArray){
    if (wordMap.getOrElse(i,-1)!=(-1)){
      wordMap(i) = wordMap(i)+1
    }
  }
  println(wordMap)
  
//分割字符串
  def splitWord(word: String) = {
    wordArray ++= word.split("\t")
  }

}

网上大神的优秀代码

需要使用Spark
scala> var f1=sc.textFile("/tmp/dataTest/followers.txt")

scala> f1.flatMap(x=>x.split("-")).map((_,1)).collect //每个数字以'-'分割,并数字为key,给每个key赋值1
res10: Array[(String, Int)] = Array((2,1), (1,1), (4,1), (1,1), (1,1), (2,1), (6,1), (3,1), (7,1), (3,1), (7,1), (6,1), (6,1), (7,1), (3,1), (7,1))

reduceByKey(_+_).collect 将key相同元素合并(4出现一次,7出现4次,6出现3次,2出现2次,3出现3次,1出现3次)

scala> f1.flatMap(x=>x.split("-")).map((_,1)).reduceByKey(_+_).collect
res12: Array[(String, Int)] = Array((4,1), (7,4), (6,3), (2,2), (3,3), (1,3))

对出现的次数进行排序
sortByKey

scala> var resText=f1.flatMap(x=>x.split("-")).map((_,1)).reduceByKey(_+_).map(x=>(x._2,x._1)).sortByKey(false).map(x=>(x._2,x._1))
resText: org.apache.spark.rdd.RDD[(String, Int)] = MapPartitionsRDD[39] at map at <console>:26

对出现的次数进行排序,所以要先将元素的第二个元组和第一个元组互换位置map(x=>(x._2,x._1)),这样出现的次数就成了key,然后再对key进行排序sortByKey(false)
再对排序后的结果,再一次的对他们的元组进行互换位置(次数,单词)换后(单词,次数)map(x=>(x._2,x._1))

false:从大到小 降序
true:小小到大 升序
简便方法:
reduceByKey(_ + _).sortBy(_._2,false)
也可以实现排序
只用Scala完成
  val lines = List("hello tom hello jerry", "hello tom hello kitty hello china")
  val wc = lines.flatMap(_.split(" ")).map((_, 1)).groupBy(_._1).map(t => (t._1, t._2.size)).toList.sortBy(_._2).reverse
  val wc2 = lines.flatMap(_.split(" ")).map((_, 1)).groupBy(_._1).mapValues(_.size)
  val wc3 = lines.flatMap(_.split(" ")).map((_, 1)).groupBy(_._1).mapValues(_.foldLeft(0)(_ + _._2))
以上用到的方法
reduceByKey

reduce方法的作用是把所有元素按照指定的方法进行处理,如f1.reduce((x, y)=>x+y),就是把f1中的元素依次按照x+y来加起来,最后的结果是所有元素的和。
reduceByKey的用处就是根据key来进行reduce处理,就是说在key相同的情况下进行处理

flatMap

flatMap=map+flatten
map把每个元素都做一个相同的操作,flatten是把嵌套的变成在同一个里面,如val f = List(List(1,2),List(3,4),List(5,6)) 执行 f.flatten的结果就是List(1,2,3,4,5,6)
所以f.flatMap(.map(*2))的结果是List(2,4,6,8,10,12)相当于f.map(.map(*2)).flatten,是先执行map,再执行flatten

groupBy

groupBy按照元素分组返回map
groupBy(_._1)第一个_表示List中的每一个元组,取元组中的某一个元素用._n,即按照元组中的某一元素分组,返回是一个map

mapValues

mapValues指的是key 不动,只是对values进行处理,结果 k v 一起返回。
mapValues(_.size)中的_指的就是v

<think>好的,用户想了解如何使用IDE实现Spark和ScalaWordCount示例。首先,我需要整理已有的引用信息,特别是引用2、3、4,它们提到了使用IntelliJ IDEA或Eclipse进行开发,以及具体的代码示例。 首先,用户可能需要一个分步教程。根据引用2,推荐使用IntelliJ IDEA,所以应该以IDEA为例来讲解。需要包括环境准备、项目创建、依赖配置、代码编写和运行步骤。 环境准备部分,需要说明安装JDK、Scala插件和Spark。引用2提到IDE的选择,所以需要指导用户安装IDEA和Scala插件。然后创建Scala项目,配置build.sbt或者Maven的依赖,添加Spark-core的库,如引用3中的示例代码需要SparkConf和SparkContext,这需要正确的依赖。 接下来是代码编写,引用3和4都提供了不同的WordCount实现,可以综合这两个例子,给出一个标准的代码结构,包括定义object,main方法,配置SparkConf,读取文件,split、map、reduceByKey等步骤,并保存结果或打印输出。要注意代码中的setMaster可能设置为local,方便本地运行。 运行部分需要说明如何设置输入参数,比如文件路径,或者像引用4中处理命令行参数。同时要提醒用户注意文件路径的正确性,避免错误。另外,引用4中的示例有两种输出方式,保存到文件和打印到控制台,可以都包含进去,让用户了解两种方法。 可能还需要提到本地运行SparkPi的示例,但用户的问题集中在WordCount,所以可能不需要展开。最后,根据用户的问题生成相关问题,比如性能优化、依赖冲突处理、不同运行模式等,参考之前的结构。 需要确保所有步骤清晰,代码正确,特别是依赖配置部分,因为用户容易在这里出错。引用3中的代码用了textFile和lambda表达式,需要检查是否符合Scala语法。另外,注意代码中的箭头符号是否正确,比如在引用3中的=>可能被转义,需要修正为正确的=>符号。 总结步骤应该是:安装IDE和插件->创建项目->添加依赖->编写代码->配置运行参数->执行。可能还需要提醒用户安装Scala SDK和正确版本的Spark,避免版本冲突,如引用1提到的Scala 2.10.5和Spark的兼容性。但用户提供的引用中没有具体版本说明,可能需要建议使用较新且兼容的版本,比如Scala 2.12和Spark 3.x。 最后,确保回答中的代码部分使用正确的格式,行内公式用$...$,独立公式用$$...$$,但这里可能不需要数学公式,所以主要关注代码块和引用标注。引用用户提供的引用2、3、4来支持步骤的正确性,比如依赖配置和代码示例。</think>### 使用IDE开发Spark Scala WordCount示例教程 #### 1. 环境准备 - **安装IntelliJ IDEA**:推荐使用IntelliJ IDEA(社区版即可),下载后安装Scala插件[^2]。 - **配置依赖**:新建Scala项目后,在`build.sbt`中添加Spark依赖: ```scala libraryDependencies += "org.apache.spark" %% "spark-core" % "3.3.0" ``` 需确保Scala版本与Spark兼容(例如Spark 3.3.0对应Scala 2.12或2.13)[^1][^2]。 #### 2. 创建WordCount代码 ```scala import org.apache.spark.{SparkConf, SparkContext} object WordCount { def main(args: Array[String]): Unit = { val conf = new SparkConf() .setAppName("WordCount") .setMaster("local[*]") // 本地运行模式 val sc = new SparkContext(conf) val inputPath = "data/input.txt" // 输入文件路径 val outputPath = "data/output" // 输出目录路径 val lines = sc.textFile(inputPath) val wordCounts = lines .flatMap(_.split(" ")) .map(word => (word, 1)) .reduceByKey(_ + _) wordCounts.saveAsTextFile(outputPath) // 保存到文件 wordCounts.collect().foreach(println) // 打印到控制台 sc.stop() } } ``` #### 3. 运行配置 1. 在IDEA中右键点击`WordCount`对象,选择**Run 'WordCount'**。 2. 若需命令行参数,可在**Run/Debug Configurations**的**Program arguments**中指定输入/输出路径(参考引用[4]的示例)。 #### 4. 验证结果 - 控制台会输出单词统计结果。 - 输出目录`data/output`会生成多个结果文件(Spark分布式计算特性导致)。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值