SparkSql 中用户自定义聚合函数---强类型

         强类型的Dataset和弱类型的DataFrame都提供了相关的聚合函数, 如 count(),countDistinct(),avg(),max(),min()。除此之外,用户可以设定自己的自定义聚合函数。

 

       强类型用户自定义聚合函数:通过继承Aggregator来实现强类型自定义聚合函数。

 

 强类型 Demo :自定义求用户平均年龄的聚合函数

package com.bigdata.spark.sql
import org.apache.spark.SparkConf
import org.apache.spark.sql.expressions.Aggregator
import org.apache.spark.sql._

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

    // c创建conf文件
    val sparkConf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("sql")

    //  创建SparkSession

    val spark: SparkSession = SparkSession.builder().config(sparkConf).getOrCreate()

    // 导入隐式转换

    import spark.implicits._

    // 自定义聚合函数
 //  创建聚合函数对象
    val udaf = new MyageAvgClassFunction

   //将聚合函数转换为查询列
    val avgCol: TypedColumn[UserBean, Double] = udaf.toColumn.name("myavg")


    // 创建RDD
    val rdd = spark.sparkContext.makeRDD(List((1,"zhangsan",20), (2,"lisi", 30), (3,"wangwu",40)))
    // 转换为DF

     val df: DataFrame = rdd.toDF("id","name","age")

    // 转换为ds
    val ds: Dataset[UserBean] = df.as[UserBean]



    //  使用聚合函数

   ds.select(avgCol).show()


   // 关闭资源
   spark.stop()

  }

}




 case class UserBean(name:String,age:Int)
case  class AvgBuffer(var sum:Int,var count: Int)


// 声明用户自定义的聚合函数
// 1) 继承Aggregator
// 2) 实现方法

class MyageAvgClassFunction extends Aggregator[UserBean,AvgBuffer,Double]{

  // 初始化
  override def zero: AvgBuffer = {
    AvgBuffer(0,0)
  }


  // 缓冲区逻辑
  override def reduce(b: AvgBuffer, a: UserBean): AvgBuffer = {
    b.sum += a.age
    b.count += 1
    b

  }

  // 多个缓冲区的合并操作
  override def merge(b1: AvgBuffer, b2: AvgBuffer): AvgBuffer = {
    b1.sum = b1.sum + b2.sum
    b1.count = b1.count + b2.count

    b1
  }

  // 完成计算
  override def finish(reduction: AvgBuffer): Double = {

    reduction.sum/reduction.count.toDouble
  }

  override def bufferEncoder: Encoder[AvgBuffer] = Encoders.product

  override def outputEncoder: Encoder[Double] = Encoders.scalaDouble
}

计算结果:

                              SparkSql 中用户自定义聚合函数---强类型_第1张图片

你可能感兴趣的:(Spark)