SparkSQL的两种UDAF的讲解
2018年07月09日 00:07:35 Spark高级玩法 阅读数:1477
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/rlnLo2pNEfx9c/article/details/80972447
Spark的dataframe提供了通用的聚合方法,比如count(),countDistinct(),avg(),max(),min()等等。然而这些函数是针对dataframe设计的,当然sparksql也有类型安全的版本,java和scala语言接口都有,这些就适用于强类型Datasets。本文主要是讲解spark提供的两种聚合函数接口:
1, UserDefinedAggregateFunction
这两个接口基本上满足了,用户自定义聚合函数的需求。
UserDefinedAggregateFunction
类UserDefinedAggregateFunction,在文件udaf.scala里面。是实现用户自定义聚合函数UDAF的基础类,首先,我们先看看该类的基本信息
abstract class UserDefinedAggregateFunction extends Serializable { StructType代表的是该聚合函数输入参数的类型。例如,一个UDAF实现需要两个输入参数, 类型分别是DoubleType和LongType,那么该StructType格式如下: new StructType() .add("doubleInput",DoubleType) .add("LongType",LongType) 那么该udaf就只会识别,这种类型的输入的数据。 def inputSchema: StructType 该StructType代表aggregation buffer的类型参数。例如,一个udaf的buffer有 两个值,类型分别是DoubleType和LongType,那么其格式将会如下: new StructType() .add("doubleInput", DoubleType) .add("longInput", LongType) 也只会适用于类型格式如上的数据 def bufferSchema: StructType dataTypeda代表该UDAF的返回值类型 def dataType: DataType 如果该函数是确定性的,那么将会返回true,例如,给相同的输入,就会有相同 的输出 def deterministic: Boolean 初始化聚合buffer,例如,给聚合buffer以0值 在两个初始buffer调用聚合函数,其返回值应该是初始函数自身,例如 merge(initialBuffer,initialBuffer)应该等于initialBuffer。 def initialize(buffer: MutableAggregationBuffer): Unit 利用输入输入去更新给定的聚合buffer,每个输入行都会调用一次该函数 def update(buffer: MutableAggregationBuffer, input: Row): Unit 合并两个聚合buffer,并且将更新的buffer返回给buffer1 该函数在聚合并两个部分聚合数据集的时候调用 def merge(buffer1: MutableAggregationBuffer, buffer2: Row): Unit 计算该udaf在给定聚合buffer上的最终结果 def evaluate(buffer: Row): Any