Spark核心算子:partitionBy与reduceByKey详解

1.RDD-转换算子-partitionBy(前面有吸气,中间有等待):

partitionBy:

函数签名:

def partitionBy(partition:Partitioner):RDD[(K,V)]

函数说明:将数据按照指定Partitioner重新进行分区,Spark默认的分区器时HashPartitioner

package com.guizhou.bigdata.spark.core.worldcount.operator.transform

import org.apache.spark.rdd.RDD
import org.apache.spark.{HashPartitioner, SparkConf, SparkContext}

object Spark14_RDD_Operator_Transform {
  def main(args: Array[String]): Unit = {

    val sparkConf = new SparkConf().setMaster("local[*]").setAppName("Operator")
    val sc = new SparkContext(sparkConf)

    //TODO 算子 - (key-Value类型)
    val rdd = sc.makeRDD(List(1,2,3,4),2)

    val mapRDD:RDD[(Int,Int)] = rdd.map((_,1))
    //RDD => PairRDDFunctions
    //隐式转换(二次编译)

    //partitionBy根据指定的分区规则对数据进行重分区
    mapRDD.partitionBy(new HashPartitioner(2))
                    .saveAsTextFile("output")

    sc.stop()

  }
}

2.RDD-转换算子-partitionBy-思考的问题:

如果重分区的分区器和当前RDD的分区器一样怎么办?

  • 两个分区器在一样的情况下,第二个分区器是完全没必要的。根据代码中的源码可以看出,第二个分区器是作为if条件来成立的。

Spark还有其他分区器吗?

  • 能用的分区器只有HashPartitioner和RangPartitioner(排序)

如果想按照自己的方法进行数据分区怎么办?

  • 可以完全模仿来进行分区

3.RDD-转换算子-reduceByKey:

函数签名:

def reduceByKey(func:(V,V)=>V):RDD[(K.V)]
def reduceByKey(func:(V,V)=>V,numPartitions:Int):RDD[(K,V)]

函数说明:可以将数据按照相同的Key对Value进行聚合

  • reduceByKey:相同的Key的数据进行value数据的聚合操作
  • scala语言中一般都是两两聚合,spark基于scala开发,所以它的聚合也是两两相乘
package com.guizhou.bigdata.spark.core.worldcount.operator.transform

import org.apache.spark.rdd.RDD
import org.apache.spark.{HashPartitioner, SparkConf, SparkContext}

object Spark15_RDD_Operator_Transform {
  def main(args: Array[String]): Unit = {

    val sparkConf = new SparkConf().setMaster("local[*]").setAppName("Operator")
    val sc = new SparkContext(sparkConf)

    //TODO 算子 - (key-Value类型)

    val rdd = sc.makeRDD(List(
      ("a",1),("a",2),("a",3),("b",4)
    ))

    //reduceByKey:相同的Key的数据进行value数据的聚合操作
    //scala语言中一般都是两两聚合,spark基于scala开发,所以它的聚合也是两两相乘
    // 【1,2,3】
    // 【3,3】
    // 【6】
    val reduceRDD: RDD[(String,Int)] = rdd.reduceByKey( (x:Int,y:Int) => {x + y})

    reduceRDD.collect().foreach(println)

    sc.stop()

  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值