Spark Core之RDD键值对算子

本文详细介绍了Spark Core中的键值对算子,包括转换算子和行动算子。转换算子如groupByKey、reduceByKey、aggregateByKey、combineByKey、sortByKey等,用于数据的分组、聚合和排序;行动算子如countByKey和saveAsSequenceFile,用于统计键的数量和将数据持久化到HDFS。这些算子在大数据处理中发挥着重要作用。
摘要由CSDN通过智能技术生成

一、 转换算子

1、groupByKey算子

def groupByKey(): RDD[(K, Iterable[V])]
def groupByKey(numPartitions: Int): RDD[(K, Iterable[V])]
def groupByKey(partitioner: Partitioner): RDD[(K, Iterable[V])]
将数据源的数据根据 key 对 value 进行分组,分组后返回一个新的函数

object GroupByKeyOperator {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("groupByKey").setMaster("local")
    val sc = new SparkContext(conf)
    var rdd = sc.makeRDD(List("hadoop", "flink", "flink", "kafka", "flink"))
    val rdd2 = rdd.flatMap(f => {
      f.split(",")
    })
    val rdd3 = rdd2.map(word => {
      (word, 1)
    })
    val rdd4 = rdd3.groupByKey()
    rdd4.foreach(println(_))
  }
}

在这里插入图片描述

2、reduceByKey算子

def reduceByKey(func: (V, V) => V): RDD[(K, V)]
def reduceByKey(func: (V, V) => V, numPartitions: Int): RDD[(K, V)]
可以将数据按照相同的Key 对Value 进行聚合

object ReduceByKeyOperator {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("reduceByKey").setMaster("local")
    val sc = new SparkContext(conf)

    val rdd = sc.makeRDD(List("hadoop", "flink", "flink", "hadoop", "spark", "kafka"))
    val rdd2 = rdd.flatMap(f => {
      f.split(",")
    })
    val rdd3 = rdd2.map(word => {
      (word, 1)
    })
    val rdd4 = rdd3.reduceByKey((a, b) => {
      a + b
    })
    rdd4.foreach(println(_))
  }
}

在这里插入图片描述

3、aggregateByKey算子

def aggregateByKey[U: ClassTag](zeroValue: U)
(
seqOp: (U, V) => U,
combOp: (U, U) => U
): RDD[(K, U)]
将数据根据不同的规则进行分区内计算和分区间计算
aggregateByKey 算子是函数柯里化,存在两个参数列表

  1. 第一个参数列表中的参数表示初始值
  2. 第二个参数列表中含有两个参数
    2.1 第一个参数表示分区内的计算规则
    2.2 第二个参数表示分区间的计算规则
object AggregateByKeyOperator {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("aggregateByKey").setMaster("local")
    val sc = new SparkContext(conf)

    val rdd = sc.makeRDD(List("hadoop", "flink", "flink", "hadoop", "spark", "kafka"))
    val rdd2 = rdd.flatMap(f => {
      f.split(",")
    })
    val rdd3 = rdd2.map(word => {
      (word, 1)
    })
    val rdd4 = rdd3.aggregateByKey(0)(
      (a, b) => {
        a + b
      },
      (a, b) => {
        a + b
      }
    )
    rdd4.foreach(println(_))
  }
}

在这里插入图片描述

4、combineByKey算子

def combineByKey[C]
(
createCombiner: V => C,
mergeValue: (C, V) => C,
mergeCombiners: (C, C) => C
): RDD[(K, C)]

最通用的对key-value 型 rdd 进行聚集操作的聚集函数(aggregation function)。类似于aggregate(),combineByKey()允许用户返回值的类型与输入不一致。

object CombineByKeyOperator {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setMaster("local").setAppName("combineByKey")
    val sc = new SparkContext(sparkConf)

    val rdd:RDD[(String,Int)] = sc.makeRDD(Array(("zs",60),("zs",70),("zs",80),("ls",66),("ls",60),("ls",77)))
    val rdd2 = rdd.combineByKey(
      (a: Int) => {
        a
      },
      (a: Int, b: Int) => {
        a + b
      },
      (a: Int, b: Int) => {
        a + b
      }
    )
    rdd2.foreach(println(_))
  }
}

在这里插入图片描述

5、sortByKey算子

def sortByKey(
ascending: Boolean = true,
numPartitions: Int = self.partitions.length
)
: RDD[(K, V)]
按照key值对RDD进行排序,返回一个排序完成RDD,同时也可以分组

object SortByKeyOperator {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setMaster("local").setAppName("kv")
    val sc = new SparkContext(sparkConf)

    val rdd:RDD[(String,Int)] = sc.makeRDD(Array(("zs",20),("ls",30),("ww",40),("zl",40),("zs",40)))
    val rdd2 = rdd.sortByKey()
    rdd2.foreach(println(_))
  }
}

在这里插入图片描述

6、join算子

def join[W](other: RDD[(K, W)]): RDD[(K, (V, W))]
将两个键值对类型RDD按照相同的key值将不同rdd的value数据整合一下
(K,V) (K,W)===>(K,(V,W))
而且只会保留两个RDD中key值相同的数据,key值不相同的数据舍弃
传入的另外一个键值对类型的RDD有要求,key值必须和当前RDD的key值类型一致,value类型可以不一致

object JoinOperator {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setMaster("local").setAppName("join")
    val sc = new SparkContext(sparkConf)

    val rdd: RDD[(String, Int)] = sc.makeRDD(Array(("zs", 20), ("ls", 30), ("ww", 40), ("zl", 40), ("zs", 40)))
    val rdd2: RDD[(String, String)] = sc.makeRDD(Array(("ls", "女"), ("zs", "男"), ("zs", "女"), ("ww", "男"), ("wb", "男")))
    val rdd3 = rdd.join(rdd2)
    rdd3.foreach(println(_))
  }
}

在这里插入图片描述

7、leftOuterJoin算子

和join类似,只不过保留左边RDD的所有数据,括号里面的RDD只保留匹配数据 (K,(V,Option[W]))

object LeftOuterJoinOperator {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setMaster("local").setAppName("leftOuterJoin")
    val sc = new SparkContext(sparkConf)

    val rdd: RDD[(String, Int)] = sc.makeRDD(Array(("zs", 20), ("ls", 30), ("ww", 40), ("zl", 40), ("zs", 40)))
    val rdd2: RDD[(String, String)] = sc.makeRDD(Array(("ls", "女"), ("zs", "男"), ("zs", "女"), ("ww", "男"), ("wb", "男")))
    val rdd3 = rdd.leftOuterJoin(rdd2)
    rdd3.foreach(println(_))
  }
}

8、rightOuterJoin算子

和join类似,只不过保留右边RDD的所有数据,左边的RDD只保留匹配(key来匹配)数据 (K,(Option[V],W))

object RightOuterJoinOperator {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setMaster("local").setAppName("rightOuterJoin")
    val sc = new SparkContext(sparkConf)

    val rdd: RDD[(String, Int)] = sc.makeRDD(Array(("zs", 20), ("ls", 30), ("ww", 40), ("zl", 40), ("zs", 40)))
    val rdd2: RDD[(String, String)] = sc.makeRDD(Array(("ls", "女"), ("zs", "男"), ("zs", "女"), ("ww", "男"), ("wb", "男")))
    val rdd3 = rdd.rightOuterJoin(rdd2)
    rdd3.foreach(println(_))
  }
}

在这里插入图片描述

9、cogroup算子

def cogroup[W](other: RDD[(K, W)]): RDD[(K, (Iterable[V], Iterable[W]))]
将两个键值对类型的RDD按照key值聚合value。将每一个RDD的key值相同的value数据聚合成为一个迭代器Iterable[V]
最终返回如下的一个RDD
RDD【(key,(Iterable[V],Iterable[W]))】

object CoGroupOperator {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setMaster("local").setAppName("cogroup")
    val sc = new SparkContext(sparkConf)

    val rdd: RDD[(String, Int)] = sc.makeRDD(Array(("zs", 20), ("ls", 30), ("ww", 40), ("zl", 40), ("zs", 40)))
    val rdd2: RDD[(String, String)] = sc.makeRDD(Array(("ls", "女"), ("zs", "男"), ("zs", "女"), ("ww", "男"), ("wb", "男")))
    val rdd3 = rdd.cogroup(rdd2)
    rdd3.foreach(println(_))
  }
}

在这里插入图片描述

10、subtractByKey算子

删除前面RDD中与括号传入的RDDkey值相同的元素,返回的是前者RDD删除完成的数据

object SubTractByKeyOperator {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setMaster("local").setAppName("subTractByKey")
    val sc = new SparkContext(sparkConf)

    val rdd: RDD[(String, Int)] = sc.makeRDD(Array(("zs", 20), ("ls", 30), ("ww", 40), ("zl", 40), ("zs", 40)))
    val rdd2: RDD[(String, String)] = sc.makeRDD(Array(("ls", "女"), ("zs", "男"), ("zs", "女"), ("ww", "男"), ("wb", "男")))
    val rdd3 = rdd.subtractByKey(rdd2)
    rdd3.foreach(println(_))
  }
}

在这里插入图片描述

11、keys算子

将键值对类型RDD中的所有key值取出来形成一个新的RDD

object KeysOperator {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setMaster("local").setAppName("Keys")
    val sc = new SparkContext(sparkConf)

    val rdd: RDD[(String, Int)] = sc.makeRDD(Array(("zs", 20), ("ls", 30), ("ww", 40), ("zl", 40), ("zs", 40)))
    val rdd2 = rdd.keys
    rdd2.foreach(println(_))
  }
}

在这里插入图片描述

12、values算子

将键值对类型RDD中的所有value值取出来形成一个新的RDD

object ValuesOperator {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setMaster("local").setAppName("Values")
    val sc = new SparkContext(sparkConf)

    val rdd: RDD[(String, Int)] = sc.makeRDD(Array(("zs", 20), ("ls", 30), ("ww", 40), ("zl", 40), ("zs", 40)))
    val rdd2 = rdd.values
    rdd2.foreach(println(_))
  }
}

在这里插入图片描述

13、mapValues算子

对键值对RDD中所有values数据应用一个func函数,代表对每一个value数据做一个操作 返回一个新的RDD
func (T)=>U
RDD[(key,U)]

object MapValuesOperator {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setMaster("local").setAppName("MapValues")
    val sc = new SparkContext(sparkConf)

    val rdd: RDD[(String, Int)] = sc.makeRDD(Array(("zs", 20), ("ls", 30), ("ww", 40), ("zl", 40), ("zs", 40)))
    val rdd2 = rdd.mapValues(a => {a + 1})
    rdd2.foreach(println(_))
  }
}

在这里插入图片描述

二、 行动算子

1、 countByKey算子

def countByKey(): Map[K, Long]
统计每种 key 的个数

object CountByKeyOperator {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setMaster("local").setAppName("CountByKey")
    val sc = new SparkContext(sparkConf)

    val rdd: RDD[(String, Int)] = sc.makeRDD(Array(("zs", 40), ("ls", 30), ("ww", 40), ("zl", 40), ("zs", 40)))
    val rdd2 = rdd.countByValue()
    rdd2.foreach(println(_))
  }
}

在这里插入图片描述

2、 saveAsSequenceFile算子

saveAsSequenceFile():rdd有几个分区在HDFS上保存几个文件

object saveAsSequenceFileOperator {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setMaster("local").setAppName("CountByKey")
    val sc = new SparkContext(sparkConf)

    val rdd: RDD[(String, Int)] = sc.makeRDD(Array(("zs", 40), ("ls", 30), ("ww", 40), ("zl", 40), ("zs", 40)))
    rdd.saveAsSequenceFile("hdfs://node1:9000/b")
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值