-
- 通过正确的分区,可以带来明显的性能提升
- 为分布式数据集选择正确的分区,类似于为传统的数据集选择合适的数据结构
分区并不是对所有应用都是有好处的:如果给定的 只需要被扫描一次,则我们完全没有必要对其预先进行分区处理。
- 只有当数据集多次在诸如连接这种基于键的操作中使用时,分区才会有帮助。
Spark
中所有的键值对RDD
都可以进行分区。系统会根据一个针对键的函数对元素进行分组。spark
可以确保同一个组的键出现在同一个节点上
许多
spark
操作会利用已有的分区信息,如join()、leftOuterJoin()、rightOuterJoin()、cogroup()、groupWith()、groupByKey()、reduceByKey()、combineByKey()、lookup()
。 这些操作都能从分区中获得收益。- 任何需要将数据根据键跨节点进行混洗的操作,都能够从分区中获得好处
.getNumPartitions
属性可以查看RDD
的分区数
-
- 如果未指定该参数,则
spark
根据集群的大小会自动推断出一个有意义的默认值
- 如果未指定该参数,则
.repartition(numPartitions)
:返回一个拥有指定分区数量的新的RDD
- 新的分区数量可能比旧分区数增大,也可能减小。
.coalesce(numPartitions,shuffle=False)
:返回一个拥有指定分区数量的新的RDD
- 新的分区数量必须比旧分区数减小
-
- 新的分区数量可能比旧分区数增大,也可能减小。
- 这里
partitionFunc
是分区函数。注意:如果你想让多个RDD
使用同一个分区方式,则应该使用同一个分区函数对象(如全局函数),而不要给每个 创建一个新的函数对象。
对于重新调整分区的操作结果,建议对其持久化。