IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Spark RDD的分区规则详解 -> 正文阅读

[大数据]Spark RDD的分区规则详解

一.RDD中数据来源

2个地方:本地集合或外部数据源

  • sc.parallelize(本地集合,分区数)
  • sc.makeRDD(本地集合,分区数) 底层是parallelize
  • sc.textFile(HDFS/文件夹,分区数) 以行为单位读取数据
  • sc.wholeTextFiles(HDFS/文件夹,分区数) 以文件为单位,专门读取小文件,结果是元组,第一个元素是文件路径,第二个元素是文件内容

RDD本身是不保存数据的,只保存计算逻辑

二.读取内存数据分区规则

数据可以按照并行度的设定进行数据的分区操作,数据分区规则的
i代表分区的索引,从0开始。length代表本地数据的个数。左闭右开

def positions(length: Long, numSlices: Int): Iterator[(Int, Int)] = {
      (0 until numSlices).iterator.map { i =>
        val start = ((i * length) / numSlices).toInt
        val end = (((i + 1) * length) / numSlices).toInt
        (start, end)
      }
    }

示例

object RddNoKey {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("Spark_RDD").setMaster("local[*]")
    val sc: SparkContext = new SparkContext(conf);

    val list = ListBuffer[Int]() // 可变List
    list.append(1,2,3,4,5)

    val nums: RDD[Int] = sc.parallelize(list,3)

    nums.saveAsTextFile("./output")
  }
}

集合中有5个元素,length = 5,设置了三个分区那么就会分为三个分区

对于分区0,由计算规则,得 [0,1),所以分区0存放下标为0的元素1
对于分区1,由计算规则,得 [1,3),所以分区1存放2和3
对于分区2,由计算规则,的 [3,5),所以分区2存放4和5

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

三.读取文件数据分区规则

4.1 分区数量的计算规则

先说结论:产生的分区数和minPartitions相等或者minPartitions+1

什么时候加1什么时候相等,我们看个例子

我们读取一个文件时,可以设定一个最小分区数minPartitions = 5,不设置的话默认不会超过2
在这里插入图片描述

以文件为单位,看文件有多少个字节!
在这里插入图片描述
那么62/ 5 = 12(Byte)…2 也就说每个分区理论应该放12个字节(标准分区)的数据,但是还余下了2个字节,这时候要根据1.1规则进行判断,如果剩余的分区大于标准分区的10%,则成为一个新的分区,在这里 2 除以 12 = 0.167,所以会产生新的分区

所以,产生的分区数和minPartitions相等或者minPartitions+1,所以这里应该是5+1=6个分区

在这里插入图片描述

4.2 数据分配到哪个分区规则

先记住两个结论
1.文件中的行是不可分割的单位
2.字节对应偏移量

上述中,产生了6个分区,每个分区的偏移量范围,注意:以偏移量12为例,偏移量12分区0可以读,分区1也可以读!

分区0 0-12 =》 [0,12]
分区1 12-24 =》[12,24]
分区2 24-36
分区3 36-48
分区4 48-60
分区5 60-64

每个分区理论应该是12个字节,也就是分区0应该放0-12偏移量单位的数据,分区1放12-24偏移量的数据,分区3放24-36偏移量的数据…

偏移量是什么?

如图,一个字符偏移量为1,第一行3个zhang和两个空格是17偏移量,但是末尾会有两个换行符偏移量为2(我们看不到),所以,第一行偏移量从0开始,到18结束
在这里插入图片描述

第一行有0-18偏移量,3个zhang+两个空格+2个默认的换行符,超出了理论偏移量,但是行不可分割,所以分区0放了第一行
在这里插入图片描述

分区1原本读12-24偏移量的数据,但是12-19已经被读了,所以只能读20-24的了,所以分区1放了liu和hao,hao的首偏移量为24,所以可以读到

在这里插入图片描述
分区2 读24-36,所以是wang和song song
在这里插入图片描述
分区3是36-48,所以是kun kun
在这里插入图片描述

分区4是48-60,所以是li song
在这里插入图片描述

分区5无数据

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 23:28:20  更:2022-04-01 23:28:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:07:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码