一、概述
DataFrames的内置函数提供了常见的聚合函数,比如count(), countDistinct(), avg(), max(), min()等,但是这些函数是为DataFrames而设计的,Spark SQL也有适用于强类型的Datasets的类型安全的函数。此外,用户也可以自定义聚合函数。自定义聚合函数有两种类型,一种是无类型的自定义聚合函数(适用于DataFrame),另一种是安全类型的自定义聚合函数(适用于DataSet)。
二、两种UDAF的方式
1.无类型的用户UDAF
继承UserDefinedAggregateFunction抽象类,实现无类型的自定义聚集函数
package com.company.sparksql
import org.apache.log4j.{Level, Logger}
import org.apache.spark.sql.{Row, SparkSession}
import org.apache.spark.sql.expressions.{MutableAggregationBuffer, UserDefinedAggregateFunction}
import org.apache.spark.sql.types._
object UserDefinedUntypedAggregation {
def main(args: Array[String]): Unit = {
val spark = SparkSession
.builder()
.appName("UserDefinedUntypedAggregation")
.master("local")
.getOrCreate()
Logger.getLogger("org.apache.spark").setLevel(Level.OFF)
Logger.getLogger("org.apache.hadoop").setLevel(Level.OFF)
// 注册函数
spark.udf.register("myAverage", MyAverage)
val df = spark.read.json("file:///E:/employees.json")
df.createOrReplaceTempView("employees")
df.show()
/