共计 1588 个字符,预计需要花费 4 分钟才能阅读完成。
摘要: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 简略示例