摘要:Spark目前反对UDF,UDTF,UDAF三种类型的自定义函数。
1. 简介
Spark目前反对UDF,UDTF,UDAF三种类型的自定义函数。UDF应用场景:输出一行,返回一个后果,一对一,比方定义一个函数,性能是输出一个IP地址,返回一个对应的省份。UDTF应用场景: 输出一行,返回多行(hive),一对多, 而sparkSQL中没有UDTF, spark中用flatMap即可实现该性能。UDAF: 输出多行,返回一行, aggregate(次要用于聚合性能,比方groupBy,count,sum), 这些是spark自带的聚合函数,然而简单绝对简单。
Spark底层其实以CatalogFunction构造封装了一个函数,其中FunctionIdentifier形容了函数名字等根本信息,FunctionResource形容了文件类型(jar或者file)和文件门路;Spark的SessionCatalog提供了函数注册,删除,获取等一些列接口,Spark的Executor在接管到函数执行sql申请时,通过缓存的CatalogFunction信息,找到CatalogFunction中对应的jar地址以及ClassName, JVM动静加载jar,并通过ClassName反射执行对应的函数。
图1. CatalogFunction构造体
图2. 注册加载函数逻辑
Hive的HiveSessionCatalog是继承Spark的SessionCatalog,对Spark的基本功能做了一层装璜以适配Hive的基本功能,其中包含函数性能。HiveSimpleUDF对应UDF,HiveGenericUDF对应GenericUDF,HiveUDAFFunction对应AbstractGenericUDAFResolve以及UDAF,HiveGenericUDTF对应GenericUDTF
图3. Hive装璜spark函数逻辑
2. UDF
UDF是最罕用的函数,应用起来绝对比较简单,次要分为两类UDF:简略数据类型,继承UDF接口;简单数据类型,如Map,List,Struct等数据类型,继承GenericUDF接口。
简略类型实现UDF时,可自定义若干个名字evaluate为的办法,参数和返回类型依据须要本人设置。因为UDF接口默认应用DefaultUDFMethodResolver去办法解析器获取办法,解析器是依据用户输出参数和写死的名字evaluate去反射寻找办法元数据。当然用户也能够自定义解析器解析办法。
图4. 自定义UDF简略示例
图5.默认UDF办法解析器
3. UDAF
UDAF是聚合函数,目前实现形式次要有三种:实现UDAF接口,比拟老的简答实现形式,目前曾经被废除;实现UserDefinedAggregateFunction,目前应用比拟广泛形式,按阶段实现接口汇集数据;实现AbstractGenericUDAFResolver,实现绝对UserDefinedAggregateFunction形式略微简单点,还须要实现一个计算器Evaluator(如通用计算器GenericUDAFEvaluator),UDAF的逻辑解决次要产生在Evaluator。
UserDefinedAggregateFunction定义输入输出数据结构,实现初始化缓冲区(initialize),聚合单条数据(update),聚合缓存区(merge)以及计算最终后果(evaluate)。
图6.自定义UDAF简略示例
4. UDTF
UDTF简略粗犷的了解是一行生成多行的主动函数,能够生成多行多列,又被称为表生成函数。目前实现形式是实现GenericUDTF接口,实现2个接口,initialize接口参数校验,列的定义,process接口承受一行数据,切割数据。
图7.自定义UDTF简略示例