1、reduceByKey(func):功能是使用func函数合并具有相同键的值。

2、groupByKey():功能是对有相同键的值进行分组,比如有四个键值对("spark",1),("spark",2),("hadoop",3),("hadoop",5)采用groupByKey()后结果为:("spark",(1,2)),("hadoop",(3,5))

3、keys:返回的是键值对的键列表,rdd.keys。

4、values:返回的是键值对的值列表,rdd.values。

5、sortByKey(false/true):按照键进行排序,参数为false则表示降序,true表示升序

6、sortBy(value,false/true):按照给的value进行排序,参数为false则表示降序,true表示升序。

7、mapValues(func):rdd.mapValues(x=>x+1),其中x直接表示值, 返回的是(key,value)方式,比如:

val rdd=sc.parallelize(Array(("spark",2),("hadoop",6),("hadoop",4),("spark",6)))
rdd.mapValues(x=>(x,1)).foreach(println)

返回的则是:

(spark,(2,1))
(hadoop,(4,1))
(spark,(6,1))
(hadoop,(6,1))

由此可见func不管是什么,都会默认在前边加了一个key

8、join():对两个键值对进行连接,也就是将有相同键的键值分别合并成一个新的键值对,值为两个键值对的值列表,如:("spark",1),("spark",2),("hadoop",3),("hadoop",5)和("spark","fast")合并之后是:("spark",(1,"fast")),("spark",(2,"fast"))

9、conbineByKey(createCombiner,mergeValue,mergeCombiners,partitioner,mapSideCombine)中的参数含义:

(1)createCombiner:在第一次遇到key时创建组合器函数,将RDD数据集中的V类型值转换成C类型值(V=>C)

(2)mergeValue:合并值函数,再次遇到相同的Key时,将createCombiner的C类型值与这次传入的V类型值合并成一个C类型值(C,V)=>C

(3)mergeCombiners:合并组合器函数,将C类型值两两合并成一个C类型值;

(4)partitioner:使用已有的或自定义的分区函数,默认是HashPartitioner;

(5)mapSideCombine:是否在map端进行Combine操作,默认为true,如下代码所示:

import org.apache.spark.SparkContext
import org.apache.spark.SparkConf
object Combine {
  def main(args:Array[String]): Unit ={
    val conf=new SparkConf().setAppName("Combine").setMaster("local")
    val sc=new SparkContext()
    val data = sc.parallelize(Array(("company-1",88),("company-1",96),("company-1",85),("company-2",94),("company-2",86),("company-2",74),("company-3",86),("company-3",88),("company-3",92)),3)
    val res = data.combineByKey(
      (income)=>(income,1),
      (acc:(Int,Int),income)=>(acc._1+income,acc._2+1),
      (acc1:(Int,Int),acc2:(Int,Int))=>(acc1._1+acc2._1,acc1._2+acc2._2)
    ).map(
      {
        case (key,value)=>(key,value._1,value._1/value._2.toFloat)
      }
    )
    res.repartition(1).saveAsTextFile("file:///sunxj/spark/combine/")
  }
}

输出结果如下图所示:

spark sql 分组取 top spark分组函数_键值对

讲解:此函数的功能是计算公司的总收入和平均收入

1、在执行data.combineByKey()时,首先系统去除data中的第一个rdd元素即("company-1",88),key是company-1,由于这个key是第一次遇到,因此Spark会为这个key创建一个组合器函数:(income)=>(income,1),此时系统会把company-1这个key对应的value赋值给income,也就是把88赋值给income,接着转换成一个元祖(88,1),然后系统取出第二个rdd元素,即("company-1",96),key为company-1,由于这是第二次遇到相同的key,因此系统就会使用:(acc:(Int,Int),income)=>(acc._1+income,acc._2+1)此时的acc就表示(96,1),income表示88,然后执行acc._1+income,acc._2+1,acc._1表示96,acc._2表示1,因此最后结果为:(96+88,1+1)=(184,2)184就表示两个月的总收入,2表示两个月,依次类推得出公司的总收入和月份。

2、由于RDD元素有可能分成了多个分区,而多个分区可能位于不同的机器上,因此就需要通过:

(acc1:(Int,Int),acc2:(Int,Int))=>(acc1._1+acc2._1,acc1._2+acc2._2)对所有分区进行合并其中acc1表示第一个分区(服务器1),acc2表示第二个分区(服务器2),合并好之后得出的值又会和第三个分区(服务器3)进行合并,最终将所有相同key的合并到一起返回一个(key,(总收入,月数)),然后在通过map计算平均收入(总收入/月数)

3、由于在构建sc时设置了3个分区(三台服务器同步执行),那么会生成3个文件,需要将3个分区合并成一个分区使之生成一个文件,即可通过res.repartition(1)设置。