Spark 编程案例 WordCount、TopKey【Scala代码实现】


WordCount 案例


案例流程图

在这里插入图片描述

首先集群存在单词数据
在这里插入图片描述


代码实现

package cn.kaizi.spark

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


/**
 * 基于Scala语言使用SparkCore编程实现词频统计:WordCount
 *        从HDFS上读取数据,统计WordCount,将结果保存到HDFS上
 **/

object SparkWordCount {
    
    

  // TODO: 当应用运行在集群上的时候,MAIN函数就是Driver Program,必须创建SparkContext对象
  def main(args: Array[String]): Unit = {
    
    
    // 创建SparkConf对象,设置应用的配置信息,比如应用名称和应用运行模式
    val sparkConf: SparkConf = new SparkConf()
      .setMaster("local[2]")  // 设置运行本地模式
      .setAppName("SparkWordCount")
    // TODO: 构建SparkContext上下文实例对象,读取数据和调度Job执行
    val sc: SparkContext = new SparkContext(sparkConf)
    // 第一步、读取数据
    // 封装到RDD集合,认为列表List
    val inputRDD: RDD[String] = sc.textFile("/datas/wordcount.data")
    // 第二步、处理数据
    // 调用RDD中函数,认为调用列表中的函数
    // a. 每行数据分割为单词
    val wordsRDD = inputRDD.flatMap(line => line.split("\\s+"))
    // b. 转换为二元组,表示每个单词出现一次
    val tuplesRDD: RDD[(String, Int)] = wordsRDD.map(word => (word, 1))
    // c. 按照Key分组聚合
    val wordCountsRDD: RDD[(String, Int)] = tuplesRDD.reduceByKey((tmp, item) => tmp + item)
    // 第三步、输出数据
    wordCountsRDD.foreach(println)
    // 保存到为存储系统,比如HDFS
    wordCountsRDD.saveAsTextFile(s"/datas/swc-output-${System.currentTimeMillis()}")
    // 为了测试,线程休眠,查看WEB UI界面
    Thread.sleep(10000000)
    // TODO:应用程序运行接收,关闭资源
    sc.stop()
  }

}

运行结果:

(hive,3)
(spark,4)
(sprk,1)
(hadoop,1)



TopKey 案例


sortByKey

1)sortByKey:针对RDD中数据类型key/value对时,按照Key进行排序

def sortByKey(
    ascending: Boolean = true,
    numPartitions: Int = self.partitions.length
    ): RDD[(K, V)]

sortBy

2)sortBy:针对RDD中数据指定排序规则

def sortBy[K](
    f: (T) => K, // T 表示RDD集合中数据类型,此处为二元组
    ascending: Boolean = true,
    numPartitions: Int = this.partitions.length
    )
    (implicit ord: Ordering[K], ctag: ClassTag[K]): RDD[T]

top

3)top:按照RDD中数据采用降序方式排序,如果是Key/Value对,按照Key降序排序

def top(num: Int)(implicit ord: Ordering[T]): Array[T]

代码实现

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

object SparkTopKey {
    
    

  def main(args: Array[String]): Unit = {
    
    
    // 创建SparkConf对象,设置应用的配置信息,比如应用名称和应用运行模式
    val sparkConf: SparkConf = new SparkConf()
      .setMaster("local[2]")
      .setAppName("SparkWordCount")
    // TODO: 构建SparkContext上下文实例对象,读取数据和调度Job执行
    val sc: SparkContext = new SparkContext(sparkConf)
    // 第一步、读取数据
    // 封装到RDD集合,认为列表List
    val inputRDD: RDD[String] = sc.textFile("/datas/wordcount.data")
    // 第二步、处理数据
    // 调用RDD中函数,认为调用列表中的函数
    // a. 每行数据分割为单词
    val wordsRDD = inputRDD.flatMap(line => line.split("\\s+"))
    // b. 转换为二元组,表示每个单词出现一次
    val tuplesRDD: RDD[(String, Int)] = wordsRDD.map(word => (word, 1))
    // c. 按照Key分组聚合
    val wordCountsRDD: RDD[(String, Int)] = tuplesRDD.reduceByKey((tmp, item) => tmp + item)
    // 第三步、输出数据
    wordCountsRDD.foreach(println)
    /*
    (spark,7)
    (hadoop,5)
    (hbase,1)
    (hive,3)
    (mapreduce,1)
    */
    // TODO: 按照词频count降序排序获取前3个单词, 有三种方式
    println("======================== sortByKey =========================")
    // 方式一:按照Key排序sortByKey函数, TODO: 建议使用sortByKey函数
    /*
    def sortByKey(
    ascending: Boolean = true,
    numPartitions: Int = self.partitions.length
    ): RDD[(K, V)]
    */
    wordCountsRDD
      .map(tuple => tuple.swap) //.map(tuple => (tuple._2, tuple._1))
      .sortByKey(ascending = false)
      .take(4)
      .foreach(println)
    println("======================== sortBy =========================")
    // 方式二:sortBy函数, 底层调用sortByKey函数
    /*
    def sortBy[K](
    f: (T) => K, // T 表示RDD集合中数据类型,此处为二元组
    ascending: Boolean = true,
    numPartitions: Int = this.partitions.length
    )
    (implicit ord: Ordering[K], ctag: ClassTag[K]): RDD[T]
    */
    wordCountsRDD
      .sortBy(tuple => tuple._2, ascending = false)
      .take(4)
      .foreach(println)
    println("======================== top =========================")
    // 方式三:top函数,含义获取最大值,传递排序规则, TODO:慎用
    /*
    def top(num: Int)(implicit ord: Ordering[T]): Array[T]
    */
    wordCountsRDD
      .top(4)(Ordering.by(tuple => tuple._2))
      .foreach(println)
    // 为了测试,线程休眠,查看WEB UI界面
    Thread.sleep(10000000)
    // TODO:应用程序运行接收,关闭资源
    sc.stop()
  }
}

运行结果:

(hive,3)
(spark,4)
(sprk,1)
(hadoop,1)
======================== sortByKey =========================
(4,spark)
(3,hive)
(1,sprk)
(1,hadoop)
======================== sortBy =========================
(spark,4)
(hive,3)
(sprk,1)
(hadoop,1)
======================== top =========================
(spark,4)
(hive,3)
(hadoop,1)
(sprk,1)

猜你喜欢

转载自blog.csdn.net/shuyv/article/details/116241697
今日推荐