-
从内存中创建RDD
-
分区:指定分区;默认分区:默认第一会去看你的sparkcontext上下文环境是否配置,没有就默认(默认为你的CPU核数)
-
分区数据分配:分区数转换为列表【0,1...】,数据分区核心源码:start = (i * length) / num;end = ((i + 1) * length) / num;数据分区范围为【start,end】length为数据(数组)长度,num为分区数
例:数据:【1,2,3,4】 ; 3分区【0,1,2】
0 = > start=0*4/3=0 ;end=(0+1)*4/3=1 => [0,1]
1 = > start=1*4/3=1,end=2*4/3=2 =>[1,2]
2 = > start=2*4/3=2,end=3*4/3=4 = >[2,4]
数据:【1,2,3,4,5】 ; 3分区【0,1,2】
0 = > start=0*5/3=0 ;end=(0+1)*5/3=1 => [0,1]
1 = > start=1*5/3=1,end=2*5/3=3 =>[1,3]
2 = > start=2*5/3=3,end=3*5/3=5 = >[3,5]
-
-
从文件中创建RDD
-
分区:存在一个最小分区(可指定):默认的是默认最小分区和2之间的最小数,默认最小分区为你的CPU核数,所以一般最小分区为2;最小分区的存在说明分区数不确定
那么具体分区数为多少?spark分区最终调用的是hadoop的切块,它会先读取所有文件的字节总数,字节总数 除(/) 最小分区数 来获取每个分区的字节数,然后按字节数分区,这里有着1.1原则(hadoop切块原则)
例:7个字节最小分区2:7/2=3(byte) 每个分区3个字节,7/3=2.....1(1/3=0.33)超出1.1则需重新分配一区,所以最终存在3个分区
-
分区数据读取:spark采用的是hadoop的读取方式,按行读取,且数据读取时以偏移量为单位
例:7个字节:1** => 012(偏移量) 数据分区的偏移量计算
2** => 345 0 => [0,3] => [1,2] 按行读取,一行读完是不会再读的
3 => 6 1 => [3,6] => [3]
-
2 => [6,7] => [ ]
多个文件时计算分区是以文件为单位