SparkSQL的两种UDAF的讲解
2018年07月09日 00:07:35 Spark高级玩法 阅读数:1477
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/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
本文聚焦SparkSQL的两种UDAF。Spark的dataframe有通用聚合方法,sparksql也有类型安全版本。文章主要讲解了spark提供的UserDefinedAggregateFunction和Aggregator这两个聚合函数接口,它们基本能满足用户自定义聚合函数的需求。
2156

被折叠的 条评论
为什么被折叠?



