用Spark实现的词频统计


前言

为了能直观地感受 Spark 框架的效果,接下来我们实现一个大数据学科中最常见的教学 案例 WordCount

准备两个文本文件

在这里插入图片描述
在这里插入图片描述

方法一

package com.argonaut.bigdata.spark.core.wc

import org.apache.spark.rdd.RDD
import org.apache.spark.{
    
    SparkConf, SparkContext}

object Spark02_WordCount {
    
    
  def main(args: Array[String]): Unit = {
    
    
    //Application
    //Spark框架(一套运行应用程序的环境)
    //TODO 建立和Spark框架的连接
    //JDBC : Connection
    val sparConf = new SparkConf().setMaster("local").setAppName("WordCount") //Spark基础配置对象
    val sc = new SparkContext(sparConf)

    //TODO 执行业务操作
    //1.读取文件,获取一行一行的数据
    //这里解释一下,textFile返回的RDD[String]类型,
    // Scala中可以省略返回类型,编译器会自己去找
    // hello world
    val lines: RDD[String] = sc.textFile(path = "datas")

    //2.将一行数据进行拆分,分词
    // 扁平隐射把一行字符串变成一个一个单词
    //_.split() 等价于 x => x.split()
    // 等价于 (x) => {x.split}, 是一个匿名函数
    val words = lines.flatMap(x => x.split(" "))

    //3.将数据根据单词进行分组,便于统计
    val wordGroup: RDD[(String, Iterable[String])] = words.groupBy(word => word)
    //4.对分组后数据进行转换map()结构转换一般用
    val wordToCount = wordGroup.map {
    
    
      case (word, list) => {
    
    
        (word, list.size)
      }
    }
    //5.将转换结果采集到控制台打印
    val array: Array[(String, Int)] = wordToCount.collect()
    array.foreach(println)
    //TODO 关闭连接SparkContext
    sc.stop()
  }
}

方法二 优化

package com.argonaut.bigdata.spark.core.wc

import org.apache.spark.rdd.RDD
import org.apache.spark.{
    
    SparkConf, SparkContext}

object Spark01_WordCount {
    
    
  def main(args: Array[String]): Unit = {
    
    
    //建立spark框架连接
    //基本配置
    val sparkConf = new SparkConf().setMaster("local").setAppName("WordCount")
    //sparkConf基础配置对象 sparkConf环境 local本地环境 应用名称:WordCount
    val sc = new SparkContext(sparkConf) //将sparkConf传入核心对象中

    //读取数据
    val lin: RDD[String] = sc.textFile("datas")

    //拆分数据(扁平化)
    val words: RDD[String] = lin.flatMap(_.split(" "))

    val wordOne = words.map(
      word => (word,1)//表示单词出现过一次
    )

    //Spark 提供了更方便的功能 将分组和聚合使用一个方法实现
    //reduceByKey 相同的key 可以对value数据进行reduce聚合
    val wCount = wordOne.reduceByKey(_+_) //(x,y) => {x+y}

    //数据采集输出
    val arr: Array[(String, Int)] = wCount.collect()
    arr.foreach(println)

    //关闭spark框架连接
    sc.stop()
  }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Argonaut_/article/details/129502202