spark分区规则

spark分区规则

一、从内存中获取RDD

// Sequences need to be sliced at the same set of index positions for operations
// like RDD.zip() to behave as expected
//length集合长度,numSlices切片数,返回值为每个分区的起始下标
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)
  }
}

length = 7 numSlices = 3

partitionstartend
002
124
247

二、从文件中获取RDD

1.分区个数
//filepath 文件路径,可以用绝对路径,也可以用相对路径,可以使用*来匹配零个或多个字符
//minPartitions 最小分区数(实际分区数为:minPartitions或minPartitions+1)
context.textFile(filepath,minPartitions)

minPartitions如果不填,默认为 math.min(defaultParallelism, 2) 参数defaultParallelism为机器线程数 (windows系统使用任务管理器点击性能点击CPU查看逻辑处理器)

minPartitions为什么是minPartitions而不是partitions的含义:


//totalSize:文件包含的字节数

//numSplits = minPartitions:输入的最小分区数

//goalSize:每个分区的预估大小

long goalSize = totalSize / (numSplits == 0 ? 1 : numSplits);

//如果totalSize/numSplits的余数大于goalSize*0.1则将余数字节放入新增的分区中
2.分区分配规则

spark读取文件底层是使用hadoop,所以是按偏移量读取,每次读取一行

示例:

test.txt 使用@代表一个特殊字符(回车、换行)

1@@2@@3
行号偏移量
11@@012
22@@345
336

minPartitions = 2 totalSize = 7 goalSize = 7/2=3··········1

因为1>3*0.1所以分区数为3,Hadoop是按行读取的,所以1号分区中有1@@2@@ ,读取过的数据将不再读取

分区偏移量范围内容
1[0,3] (包含3)1@@2@@
2[3,6]3
3[7]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值