Spark之RDD分区规则

博客详细介绍了Spark中RDD的创建,特别是从集合和文件中创建RDD时的分区策略。当从集合创建RDD时不指定分区,默认分区数与本地模式的CPU核数相关。而指定分区时,根据给定数据和分区数,计算每个分区的起始和结束位置。对于文件读取,Spark默认取值为当前核数和2的最小值作为分区数,但可以通过指定分区数来调整。在计算分区时,Spark遵循Hadoop的切片策略,并按偏移量进行数据分配。

1.RDD数据从集合中创建

a.不指定分区      

        从集合创建rdd,如果不手动写分区数量的情况下,默认分区数跟本地模式的cpu核数有关

         local : 1个   local[*] : 笔记本所有核心数    local[K]:K个

b.指定分区

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

    //1)4个数据,设置4个分区,输出:0分区->1,1分区->2,2分区->3,3分区->4
    val rdd: RDD[Int] = sc.makeRDD(Array(1, 2, 3, 4), 4)

    //2)4个数据,设置3个分区,输出:0分区->1,1分区->2,2分区->3,4
    //val rdd: RDD[Int] = sc.makeRDD(Array(1, 2, 3, 4), 3)

    //3)5个数据,设置3个分区,输出:0分区->1,1分区->2、3,2分区->4、5
    //val rdd: RDD[Int] = sc.makeRDD(Array(1, 2, 3, 4, 5), 3)

    rdd.saveAsTextFile("output")

    sc.stop()
  }
}

规则

        分区的开始位置 = (分区号 * 数据总长度)/分区总数

        分区的结束位置 =((分区号 + 1)* 数据总长度)/分区总数

2.文件中读取后创建

a.默认

        默认取值为当前核数和2的最小值,一般为2

b.指定

1).分区数量的计算方式:

totalSize = 10

goalSize = 10 / 3 = 3(byte) 表示每个分区存储3字节的数据

分区数= totalSize/ goalSize = 10 /3 => 3,3,4

4子节大于3子节的1.1倍,符合hadoop切片1.1倍的策略,因此会多创建一个分区,即一共有4个分区  3,3,3,1

2). Spark读取文件,采用的是hadoop的方式读取,所以一行一行读取,跟字节数没有关系

3).数据读取位置计算是以偏移量为单位来进行计算的。

4).数据分区的偏移量范围的计算

        0 => [0,3]         1     012        0 => 1,2

        1 => [3,6]         2     345        1 => 3        

        2 => [6,9]         3     678        2 => 4

        3 => [9,9]         4      9           3 => 无

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值