Spark WordCount 案例

news2024/11/20 15:38:05

文章目录

  • Spark WordCount 案例
    • 1、程序连接 Spark
    • 2、WordCount 案例示例
    • 3、复杂版 WordCount
    • 4、Spark 框架Wordcount

Spark WordCount 案例

1、程序连接 Spark

首先这个Scala spark程序和spark的链接,跟sql编程类似。首先new 一个新的val context = SparkContext()对象,然后还要用到
val conf = SparkConf.setMaster("local").setAppName("WordCount")这个是配置信息,比如这个是本地连接所以里面是local,然后后面那个是程序的名字,这个写完之后,吧这个conf对象放在SparkContext(conf) 这里面。然后在程序的最后,用完了要关闭连接,context.stop(),使用stop方法关闭

2、WordCount 案例示例

先在D盘,把要测试的文件数据准备好
在这里插入图片描述

思路:首先连接之后,第一步是读取文件,使用 textFile()方法,里面的参数是要读取的文件的路径,然后把文件一行一行的读取出来。第二步是使用flatMap(_.split(" "))方法,进行map映射和扁平化,把单词按照空格分割开。第三步是groupBy(word => word)按照单词进行分组,一样的单词分到一组。第四步map()映射进行模式匹配,取去key和他的集合的size也就是单词出现的次数。然后使用collect()方法将结果采集打印,最后使用foreach(println)进行遍历。

package com.atguigu.bigdata.spark.core.wc

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

class spark01_WordCount {

}
object spark01_WordCount{
  def main(args: Array[String]): Unit = {
    // Application 我们自己写的应用程序
    // Spark 框架
    //用我们的应用程序去连接spark 就跟那个sql 编程一样
    //TODD建立和Spark 框架的连接
     //1、Java里面是Conntection 进行连接
     //2、Scala 里有个类似的,SparkContext()
      //2.1 SparkConf()配置不然不晓得连的哪个. setMaster() 里面是本地连接,setAppName() 里面是app的名称
    val sparkConf = new SparkConf().setMaster("local").setAppName("WordCount")
    val context = new SparkContext(sparkConf)
    println(context)

    //TODD 执行业务操作
    //1、读取文件,获取一行一行的数据 这一步是扁平化
    //hello word
    val value = context.textFile("D:\\wc.txt") //textFile 可以吧文件一行一行的读出来


    //2、将数据进行拆分,形成一个一个的单词
    //扁平化:将整体拆分为个体的操作
    //"hello word" => hello,word
    val danci: RDD[String] = value.flatMap(a => a.split(" ")) //根据空格进行拆分


    //3、将数据根据单词进行分组,便于统计
    //(hello,hello,hello,hello,hello),(word,word,word) 这个样子的
    //按照单词进行分组
    val wordGroup = danci.groupBy(word => word) //按照单词进行分组

    //4、对分组数的数据进行转换
    //(hello,hello,hello,hello,hello),(word,word,word)
    //(hello,5),(word,3)
    val wordToCount =  wordGroup.map{ //模式匹配
      case (word,list) => {
        (word,list.size) //匹配,第一个是单词。第二个是长度,这个长度就是单词出现的次数
      }
    }

    //5、将转换结果采集到控制台打印出来
    val tuples = wordToCount.collect() //collect()方法,将结果采集打印
    tuples.foreach(println)



    //TODD 关闭连接
    context.stop() //这样就关闭连接了


  }
}

3、复杂版 WordCount

因为之前那个是用size方法得到次数,但是这样就不像是一个聚合操作,所以使用map映射,然后使用reduce 进行聚合操作,这样来得到单词出现的次数。

package com.atguigu.bigdata.spark.core.wc

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

//复杂版wordcount
class spark01_fuzaWrodCount {

}
object spark01_fuzaWrodCount{
  def main(args: Array[String]): Unit = {
    //之前是使用size 方法,得出单词出现的次数,但是那样实现不像是个聚合功能,所以我们改善一下
    val sparkConf = new SparkConf().setMaster("local").setAppName("WordCount")
    val context = new SparkContext(sparkConf)
    println(context)

    //TODD 执行业务操作
    //1、读取文件,获取一行一行的数据 这一步是扁平化
    //hello word
    val value = context.textFile("D:\\wc.txt") //textFile 可以吧文件一行一行的读出来


    //2、将数据进行拆分,形成一个一个的单词
    //扁平化:将整体拆分为个体的操作
    //"hello word" => hello,word
    val danci: RDD[String] = value.flatMap(a => a.split(" ")) //根据空格进行拆分

    val wordToOne: RDD[(String, Int)] = danci.map(word => (word, 1)) //直接在这一步统计单词出现的次数
    val wordGroup: RDD[(String, Iterable[(String, Int)])] = wordToOne.groupBy(t => t._1) //然后按照方式,取第一个元素为分组的依据
    val wordToCount = wordGroup.map{ //这一步不是用size了
      case (word,list) => {
        list.reduce(
          (t1,t2) => {
            (t1._1,t1._2 + t2._2)
          }
        )
      }
    }
    //这里不是直接size,而是进行reduce,聚合操作,将key给加起来
    //val wordCount2 = wordGroup.map{case (word,list)=>{ list.reduce((t1,t2)=>{(t1._1,t1._2+t2._2)})}}
    val array: Array[(String, Int)] = wordToCount.collect() //采集结果打印输出
    array.foreach(println) //foreach()方法进行遍历
    

    //TODD 关闭连接
    context.stop() //这样就关闭连接了


  }
}

4、Spark 框架Wordcount

Spark框架里面有个方法,分组和聚合可以一个方法完成reduceByKey(_ + _),这样大大减少了代码量,从读取文件进来,到输出结果四五行就能完成这个案例。

package com.atguigu.bigdata.spark.core.wc

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

//使用saprk框架进行统计
class spark02_sparkCount {

}
object spark02_sparkCount{
  def main(args: Array[String]): Unit = {
    //之前是使用size 方法,得出单词出现的次数,但是那样实现不像是个聚合功能,所以我们改善一下
    val sparkConf = new SparkConf().setMaster("local").setAppName("WordCount")
    val context = new SparkContext(sparkConf)
    println(context)

    //TODD 执行业务操作
    //1、读取文件,获取一行一行的数据 这一步是扁平化
    //hello word
    val value = context.textFile("D:\\wc.txt") //textFile 可以吧文件一行一行的读出来


    //2、将数据进行拆分,形成一个一个的单词
    //扁平化:将整体拆分为个体的操作
    //"hello word" => hello,word
    val danci: RDD[String] = value.flatMap(a => a.split(" ")) //根据空格进行拆分

    val wordToOne: RDD[(String, Int)] = danci.map(word => (word, 1)) //直接在这一步统计单词出现的次数

    //Spark 框架提供了更多的功能,可以将分组和聚合使用一个功能实现
    //reduceByKey():相同的key的数据,可以对value进行reduce聚合 这是spark提供的功能
    val wordCount = wordToOne.reduceByKey((x,y) => x+y) //相当于同一个key 进行累加_ + _ 可以简化成这样


    val array: Array[(String, Int)] = wordCount.collect() //采集结果打印输出
    array.foreach(println) //foreach()方法进行遍历


    //TODD 关闭连接
    context.stop() //这样就关闭连接了


  }
}

简化下来就是这几步
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/162936.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

谷粒商城-高级篇-Day10-ElasticSearch

初步检索 1、_cat GET /_cat/nodes:查看所有节点 GET/_cat/health:查看es健康状况 GET/_cat/master:查看主节点 GET/_cat/indices:查看所有索引–相当于查询所有数据库 2、索引一个文档 put:http://192.168.205.128:9200/customer/external/1 {"name&qu…

Qt之加载百度离线地图(WebKit和WebEngine)

最近翻看进年前写了一篇关于百度离线地图的博客:Qt加载百度离线地图,发现存在很多问题,比如不能加载折线等图形覆盖物;只支持QtWebKit,不支持QtWebEngine。 之前做项目需要在百度离线地图上绘制Mesh拓扑图,必须添加折线覆盖物,使用的是百度离线地图API V2.1,满足需求。…

Java注解详解

什么是注解 ​ 用一个词就可以描述注解,那就是元数据,即一种描述数据的数据。所以,可以说注解就是源代码的元数据 元注解 JDK1.5之后内部提供的注解: Deprecated 意思是“废弃的,过时的”Override 意思是“重写、覆…

算法训练营 day18 二叉树 找树左下角的值 路径总和 从中序与后序遍历构建二叉树

算法训练营 day18 二叉树 找树左下角的值 路径总和 从中序与后序遍历构建二叉树 找树的左下角 513. 找树左下角的值 - 力扣(LeetCode) 给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节…

Java --- JUC之原子类

目录​​​​​​​ 一、基本类型原子类 二、数组类型原子类 三、引用类型原子类 四、对象的属性修改类型原子类 五、原子操作增强类 5.1、高性能热点商品应用 5.2、LongAdder架构图 5.3、源码分析 一、基本类型原子类 public class AtomicTest1 {public static final…

canvas:基础知识【直线和矩形】

canvas,就是画布,是HTML5和核心技术之一,结合JavaScript,可以绘制各种各样的图形,比如矩形、曲线、圆形等等。另外,canvas可以绘制图表、动画效果、游戏开发。 基本图形汇中有直线和曲线。常见的直线图形是…

arduino rc522模块使用

rfid IC卡 先了解IC卡一些前置知识。 首先我们会有一张ic卡(M1类型IC卡,一般买到的都是1K存储空间),在rc522代码中会出现这个,就是对IC卡进行检查PICC_TYPE_MIFARE_4K和PICC_TYPE_MIFARE_1K就是一种卡片类型不同大小…

零基础学MySQL(二)-- 表的创建,修改,删除

文章目录🎈一、创建表1️⃣基本语法2️⃣入门案例🎆二、MySQL常用数据类型1️⃣数值型(整型)默认有符号2️⃣数值型(bit)3️⃣数值型(浮点型)默认有符号4️⃣字符串的基本使用5️⃣字…

1584_AURIX_TC275_SMU的调试以及部分寄存器

全部学习汇总: GreyZhang/g_TC275: happy hacking for TC275! (github.com) 前面学习的过程中,突然间减速了不少。但是为了保证学习的推进,还是得有每天的稳定输出。我的策略是多看,多处理,之后每天整理10页标注的文档…

设计模式相关内容介绍

1.学习设计模式好处 提高编程能力、思维能力、设计能力程序设计更加标准化、代码编制更加工程化,软件开发效率大大提高,缩短项目周期设计的代码可重用性高、可读性强、可靠性高、 灵活性好、可维护性强 2.设计模式分类 创建型模式 提供创建对象的机制…

一文读懂工业级交换机的规范使用

工业交换机具备电信级特性特点,可承受严苛的工作环境,产品种类丰富多彩,交换机配置灵便,可以满足各类工业应用的应用标准。那么,大家使用工业级交换机的过程当中应该如何规范使用呢? 工业级交换机其实质运…

蓝队攻击的四个阶段(四)

目录 一, 外网纵向突破 1.1 何为外网纵向突破 1.2外网纵向突破的主要工作 二, 外网纵向突破的途径 1. Web 网站 2.外部邮件系统 3.边界网络设备 4.外部应用平台 三,内网横向拓展 1. 1何为内网横向拓展 1.2 内网横向拓展的主要工作 …

电商价格监测,关注这些,才算实际到手价

品牌控价的第一项工作,是先找出低价乱价链接,这就需要进行电商价格监测。但是我们搜索品牌链接的时候,会发现网页上的价格是多种多样:有原价(但是划掉了)、促销价、折扣价、惊喜价,优惠活动也是…

localStorage

localStorage localStorage了解 有些数据确实需要存储在本地,但是它却不需要发送到服务器,所以并不适合放在cookie中 localStorage 也是一种浏览器存储数据的方式(本地存储),它只是存储在本地,不会发送…

【Linux】进程间通信(1)

信号 什么是信号?信号是给程序提供一种可以处理异步事件的方法,它利用软件中断来实现。不能自定义信号,所有信号都是系统预定义的。 信号由谁产生? 由shell终端根据当前发生的错误(段错误、非法指令等)Ctr…

商品详情的APP原数据接口测试

一、原数据接口的来源: 原数据接口来源于手机端,随着智能化的发展与普及,越来越多的人都是使用智能手机,这样极大的方便了人民的生活,各大电商平台看准了这个商家,把目光都瞄准这个商机,伴随而…

BP靶场中SQL注入练习

BP靶场中SQL注入练习1.Bp靶场介绍1.1.访问靶场1.2.注意事项2.SQL注入靶场2.1.注意事项2.2.检索隐藏数据2.2.1.开启靶场2.2.2.点击礼物2.2.3.测试类型2.2.4.爆出全部物品(包括隐藏)2.3.登录逻辑2.3.1.开启靶场2.3.2.登录账户2.3.3.注释验证2.3.4.成功登陆2.4.判断列2.4.1.开启靶…

会话技术--cookie和session

一、会话跟踪技术的概述 对于会话跟踪这四个词,我们需要拆开来进行解释,首先要理解什么是会话,然后再去理解什么是会 话跟踪: 会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接&#…

变量、作用域与内存

目录 原始值与引用值 动态属性 复制值 传递参数 确定类型 执行上下文与作用域 作用域链增强 变量声明 1.使用var 的函数作用域声明 2. 使用let 的块级作用域声明 3.使用const 的常量声明 标识符查找 垃圾回收 标记清理(最常用) 引用计数 内…

2022__我的嵌入式入坑之路

目录 一、学习篇 51单片机: python爬虫: stm32单片机: ad: 立创EDA: openmv: ardunio: ESP32: 汇编语言: ROS: FreeRTOS: matlab&a…