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 => 无
文章评论