首页 > 其他分享 >Spark:WordCount 原理

Spark:WordCount 原理

时间:2022-09-28 18:45:57浏览次数:45  
标签:字符 读取 WordCount new 缓冲区 原理 Spark 数据 字节

IO 原理

IO 流主要分为字节流字符流

  • 字节流可以处理任何类型的数据,如图片,视频等。
  • 字符流只能处理字符类型的数据。

字节文件操作流

原理1

InputStream inputStream = new FileInputStream("path");
int i = 0;
// 一次读取一个字节
while ((i = inputStream.read()) != -1) {
  	// 字符在底层存储的时候存储的是数值,即字符对应的 ASCII 码。
    System.out.println(i);
}
// 关闭IO流
inputStream.close();
  1. 字节文件输入流 FileInputStreampath 下读取数据。

  2. 每次读取一个字节,然后马上打印,再接着读取下一个字节数据。

字节缓冲流(高效流)

原理2

// BufferedInputStream 字节缓冲输入流,提高了读取效率。
InputStream in = new FileInputStream("path");
// 字节缓存流
BufferedInputStream bis = new BufferedInputStream(in);
byte[] bs = new byte[20];
int len = 0;
while ((len = bis.read(bs)) != -1) {
    System.out.print(new String(bs, 0, len));
}
// 关闭流
bis.close();
  1. 字节文件输入流 FileInputStreampath 下读取数据。
  2. 读取的字节不会马上输出到控制台,而是在 BufferedInputStream 字节缓冲流的缓冲区中缓冲,接着继续读取下一个字节文本数据。
  3. 当缓冲区中的数据超过阈值的时候开始将缓冲区的数据全部打印在控制台。

字符缓冲流(高效流)

原理3

BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("path"), "UTF-8"));
String str;
// 一次性读取一行
while ((str = reader.readLine()) != null) {
    System.out.println(str);
}
// 关闭流
reader.close();
  1. 字节文件输入流 FileInputStreampath 下读取数据。
  2. 读取的字节数据放在 InputStreamReader 的缓冲区中,接着读取下一个字节数据。
  3. InputStreamReader 的缓冲区数据足够凑成一个字符(三个字节)时,将字节转换为一个字符传入到 BufferedReader 的缓冲区缓冲。
  4. BufferedReader 的缓冲区的字符数据达到阈值时开始将字符缓冲区的字符全部打印。

WordCount 原理

val sparkConf = new SparkConf().setMaster("local").setAppName("wordCount")
val sc = new SparkContext(sparkConf)

val lines: RDD[String] = sc.textFile("datas")
val words: RDD[String] = lines.flatMap(_.split(" "))
val wordToOne: RDD[(String, Int)] = words.map(word => (word, 1))
val wordToSum: RDD[(String, Int)] = wordToOne.reduceByKey(_ + _)

val tuples: Array[(String, Int)] = wordToSum.collect()
tuples.foreach(println)

sc.stop()

wordcount原理

  1. textFile 一行一行地读取文本数据,组成 HadoopRDD 数据集。
  2. flatMapHadoopRDD 数据进行扁平化,组成 MapPartitionsRDD 数据集。
  3. mapMapPartitionsRDD 数据转化成 (word,1) 结构,组成新的 MapPartitionsRDD 数据集。
  4. reduceByKey 对新的 MapPartitionsRDD 数据按 key 进行聚合得到最终结果。

总结

  • RDD 的数据处理方式类似于 IO 流,也有装饰者设计模式。
  • RDD 的数据只有在调用 collect 方法时,才会真正的执行业务逻辑操作,而之前的封装全部是功能的扩展。
  • RDD 不保存数据,但 IO 可以临时保存一部分数据(缓冲)。

标签:字符,读取,WordCount,new,缓冲区,原理,Spark,数据,字节
From: https://www.cnblogs.com/fireonfire/p/16739200.html

相关文章

  • Java Script 原型链原理
    所有对象都有隐式原型;原型也是对象,也有隐式原型.functionUser(){}console.log(User.prototype);functionUser(){}varu=newUser();console.log(u.hasOwnProper......
  • 1.3.3.2 设计原理
    具体内容见PPT,一下都是摘要和自己的理解1模块化1.1模块的粒度模块独立性模块独立性概括了把软件划分为模块时要遵守的准则,也是判断模块构造是否合理的标准。模......
  • vue双向绑定原理
    Vue双向绑定的原理一、在讲vue双向绑定之前我们需要来了解下MVVM模式MVVM(Model-View-ViewModel)是对MVC(Model-View-Control)和MVP(Model-View-Presenter)的进一步改进。View......
  • 计算机组成原理——思维导图
    第一章计算机系统概论冯诺依曼型计算机特点1.计算机由运算器,控制器,存储器,输入和输出设备5部分组成2.采用存储程序的方式,程序和数据放在同一个存储器中,并以二进制表示......
  • redux原理是什么
    前言相信很多人都在使用redux作为前端状态管理库进去项目开发,但仍然停留在“知道怎么用,但仍然不知道其核心原理”的阶段,接下来带大家分析一下redux和react-redux两个库的......
  • React核心工作原理
    ##1.1、虚拟DOM常见问题:reactvirtualdom是什么?说一下diff算法?拿到一个问题,一般回答都是是什么?为什么?怎么办?那就按照这个思路来吧!what用JavaScript对象表示DOM......
  • React核心原理与虚拟DOM
    React基础JSXconstelement=<h1>Hello,world!</h1>;JSX,既不是字符串也不是HTML,本质上是一个JavaScript的语法扩展,且更接近于JavaScript,是通过React.createElemen......
  • 线程池底层原理详解与源码分析(补充部分---ScheduledThreadPoolExecutor类分析)
    【1】前言本篇幅是对 线程池底层原理详解与源码分析 的补充,默认你已经看完了上一篇对ThreadPoolExecutor类有了足够的了解。 【2】ScheduledThreadPoolExecutor......
  • 深入剖析堆原理与堆排序
    堆的介绍完全二叉树:完全二叉树是满二叉树去除最后N个节点之后得到的树(\(N\geq0,N\inN^*\))大根堆:节点的父亲节点比自身节点大,比如根节点的值为\(8\),比其子节点\(7\)......
  • SpringBoot(概述、起步依赖原理分析、SpringBoot配置(配置文件分类、YAML))
    SpringBoot概述SpringBoot是由Pivotal团队提供用来简化Spring的搭建和开发过程的全新框架。随着近些年来微服务技术的流行,SpringBoot也成了时下炙手可热的热点技......