您现在的位置是:首页 > 正文

Spark RDD的分区规则详解

2024-01-30 22:09:14阅读 0

一.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

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

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

3.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个分区

在这里插入图片描述

3.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无数据

网站文章

  • cocos2dx 之CCHttpRequest

    这里主要做的是cocos2dx里面的http联网类,主要是介绍get和post,我们主要是通过点击按钮来实现,话不多说,因为代码注释很详细,直接上代码: init里面: get方法: CCLabelT...

    2024-01-30 22:09:07
  • 批量插入数据之nologging

    批量插入数据之nologging

    Oracle nologging tips The nologging option is a great way to speed-up inserts and index creation. It bypasses the writing of the redo log, significantly improving performance. However, this ap

    2024-01-30 22:09:00
  • 想成为最牛B的程序员吗?

    想成为最牛程序员吗?Tip 1 要方法而不是记忆我的一个程序员朋友常跟我说记住超过200个C++函数是多么的有帮助。“我从来不必去查找函数的定义,因此我可以比其他程序员编程快上50%。”他自豪的说。可结果是什么?难道他不知道编译器的代码自动完成功能可以节约大量查找函数及输入函数的时间吗,另外当C#发布出来后,他在记忆函数上面的努力就白费了。当然,编程中对函数的熟记是一件必需的事情,但是...

    2024-01-30 22:08:31
  • css3动画用什么规则,使用css3中的什么规则来定义动画

    css3动画用什么规则,使用css3中的什么规则来定义动画

    使用css3中的“@keyframes”规则来定义动画。“@keyframes”规则用于指定动画规则,定义一个CSS动画的一个周期的行为,可以创建简单的动画;可通过沿动画序列建立关键帧来指定动画序列循环期间的中间步骤。本教程操作环境:windows7系统、CSS3&&HTML5版、Dell G3电脑。@keyframes是CSS3的一种规则,可以用来定义CSS动画的一个周期的行为,...

    2024-01-30 22:08:25
  • uniapp (小程序)uni-datetime-picker组件点击x清除组件内容很难点到

    因为uni-datetime-picker组件源码中input标签盖住了图标,修改源码样式即可。

    2024-01-30 22:08:14
  • JS正则表达式

    判断字符串中是否含e:<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title> ...

    2024-01-30 22:07:38
  • 【js】【算法】权重随机数

    /**按权重随产生机值,返回随机到的对象 * weights_arr{ * weight:10, * } */ RandomByWeight(weights_arr...

    2024-01-30 22:07:33
  • 软件测试之Linux常用命令

    介绍:命令用于修改文件或者目录的时间属性,包括访问时间和修改时间,若文件不存在,系统会建立一个新的文件。我们平时用得最多的是通过touch创建一个空文件,实际上通过touch命令可以修改文件的atim...

    2024-01-30 22:07:06
  • 【CIO人物展】中粮信托数字化中心总经理谢胜强:技术创新突破资源限制,推动信托行业数字化2.0升级...

    【CIO人物展】中粮信托数字化中心总经理谢胜强:技术创新突破资源限制,推动信托行业数字化2.0升级...

    ‍‍‍‍现场颁奖丨文末报名本文由中粮信托数字化中心总经理谢胜强投递并参与《2023中国数智化转型升级优秀CIO》榜单/奖项评选。丨推荐企业—网易数帆大数据产业创新服务媒体——聚焦数据· 改变商业信托行...

    2024-01-30 22:06:57
  • java多线程买票,同步锁

    java多线程买票,同步锁

    经典多线程例子:售卖火车票 要求销售1000张票,要求有10个窗口来进行销售, 请编写多线程程序来模拟这个效果public class MyTask implements Runnable{ private int ticket = 10; @Override public void run() { while(true){ synchr

    2024-01-30 22:06:50