Spark中Key-Value类型|partitionBy()按照Key重新分区|reduceByKey()按照K聚合V|groupByKey()按照K重新分组

Spark中Key-Value类型|partitionBy()按照Key重新分区|reduceByKey()按照K聚合V|groupByKey()按照K重新分组_第1张图片

代码实现

Spark中Key-Value类型|partitionBy()按照Key重新分区|reduceByKey()按照K聚合V|groupByKey()按照K重新分组_第2张图片

Shuffle过程(落盘)

需要把所有哦分区的数据拿到一起处理,会有shuffle
Spark中Key-Value类型|partitionBy()按照Key重新分区|reduceByKey()按照K聚合V|groupByKey()按照K重新分组_第3张图片

自定义分区器

Spark中Key-Value类型|partitionBy()按照Key重新分区|reduceByKey()按照K聚合V|groupByKey()按照K重新分组_第4张图片

源码分析

class HashPartitioner(partitions: Int) extends Partitioner {
    require(partitions >= 0, s"Number of partitions ($partitions) cannot be negative.")
    
    def numPartitions: Int = partitions
    // 通过hash 对分区数取余决定分区
    def getPartition(key: Any): Int = key match {
        case null => 0
        case _ => Utils.nonNegativeMod(key.hashCode, numPartitions)
    }
    
    override def equals(other: Any): Boolean = other match {
        case h: HashPartitioner =>
            h.numPartitions == numPartitions
        case _ =>
            false
    }
    
    override def hashCode: Int = numPartitions
}

reduceByKey()

Spark中Key-Value类型|partitionBy()按照Key重新分区|reduceByKey()按照K聚合V|groupByKey()按照K重新分组_第5张图片

代码实现

Spark中Key-Value类型|partitionBy()按照Key重新分区|reduceByKey()按照K聚合V|groupByKey()按照K重新分组_第6张图片

Shuffle

Spark中Key-Value类型|partitionBy()按照Key重新分区|reduceByKey()按照K聚合V|groupByKey()按照K重新分组_第7张图片

groupByKey()

Spark中Key-Value类型|partitionBy()按照Key重新分区|reduceByKey()按照K聚合V|groupByKey()按照K重新分组_第8张图片

代码实现

Spark中Key-Value类型|partitionBy()按照Key重新分区|reduceByKey()按照K聚合V|groupByKey()按照K重新分组_第9张图片

reduceByKey和groupByKey区别

1)reduceByKey:按照key进行聚合,在shuffle之前有combine(预聚合)操作,返回结果是RDD[k,v]。
2)groupByKey:按照key进行分组,直接进行shuffle。
3)开发指导:在不影响业务逻辑的前提下,优先选用reduceByKey。求和操作不影响业务逻辑,求平均值影响业务逻辑。

你可能感兴趣的:(零)