摘要: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简单示例

案例解析丨 Spark Hive 自定义函数应用的更多相关文章

  1. hive -- 自定义函数和Transform

    hive -- 自定义函数和Transform UDF操作单行数据, UDAF:聚合函数,接受多行数据,并产生一个输出数据行 UDTF:操作单个数据 使用udf方法: 第一种: add jar xxx ...

  2. Hive自定义函数的学习笔记(1)

    前言: hive本身提供了丰富的函数集, 有普通函数(求平方sqrt), 聚合函数(求和sum), 以及表生成函数(explode, json_tuple)等等. 但不是所有的业务需求都能涉及和覆盖到 ...

  3. hive自定义函数(UDF)

    首先什么是UDF,UDF的全称为user-defined function,用户定义函数,为什么有它的存在呢?有的时候 你要写的查询无法轻松地使用Hive提供的内置函数来表示,通过写UDF,Hive就 ...

  4. hive自定义函数学习

    1介绍 Hive自定义函数包括三种UDF.UDAF.UDTF UDF(User-Defined-Function) 一进一出 UDAF(User- Defined Aggregation Funcat ...

  5. hive自定义函数UDF UDTF UDAF

    Hive 自定义函数 UDF UDTF UDAF 1.UDF:用户定义(普通)函数,只对单行数值产生作用: UDF只能实现一进一出的操作. 定义udf 计算两个数最小值 public class Mi ...

  6. Spark SQL 自定义函数类型

    Spark SQL 自定义函数类型 一.spark读取数据 二.自定义函数结构 三.附上长长的各种pom 一.spark读取数据 前段时间一直在研究GeoMesa下的Spark JTS,Spark J ...

  7. Hive 自定义函数(转)

    Hive是一种构建在Hadoop上的数据仓库,Hive把SQL查询转换为一系列在Hadoop集群中运行的MapReduce作业,是MapReduce更高层次的抽象,不用编写具体的MapReduce方法 ...

  8. Hive 自定义函数

    hive 支持自定义UDF,UDTF,UDAF函数 以自定义UDF为例: 使用一个名为evaluate的方法 package com.hive.custom; import org.apache.ha ...

  9. Hive 自定义函数 UDF UDAF UDTF

    1.UDF:用户定义(普通)函数,只对单行数值产生作用: 继承UDF类,添加方法 evaluate() /** * @function 自定义UDF统计最小值 * @author John * */ ...

  10. Hadoop之Hive自定义函数的陷阱

    A left join B, 这个B会连到A. 如<A1,B>, <A2,B>,在处理第一条记录的时候将B.clear(),则第二条记录的B是[]空的这是自定义UDF函数必须注 ...

随机推荐

  1. Docker 日志自动轮转和清理配置

    设置 Docker 日志大小和自动删除旧日志:通过配置 Docker 使用 json-file 日志驱动,同时使用 logrotate 工具,可以设置日志的最大大小(例如100MB),并在达到该大小时 ...

  2. 如何通过SK集成chatGPT实现DotNet项目工程化?

    智能助手服务 以下案例将讲解如何实现天气插件 当前文档对应src/assistant/Chat.SemanticServer项目 首先我们介绍一下Chat.SemanticServer的技术架构 Se ...

  3. 双数组字典树 (Double-array Trie) -- 代码 + 图文,看不懂你来打我

    目录 Trie 字典树 双数组Trie树 构建 字符编码 计算规则 构建 Base Array.Check Array 处理字典首字 处理字典二层字 处理字典三层字 处理字典四层字 叶子节点处理 核心 ...

  4. js前端操作,c#后端下发xml文件

    前端: var xmlLanguageDoc; $.ajax({         url: "/GiveMeXML",//此处可随意定义,不一定是路径.在c# ,请求被捕获后,由c ...

  5. 舞会(lgP1352)

    写了一个多小时,本来觉得 bfs 能过然后码了好久发现不会确定顺序,又重新写了一遍 dfs /kk 好吧其实是因为我记得上次做这题的时候写的是 bfs 设 \(f[i][0]\) 表示以 \(i\) ...

  6. 前端工程化&&自动化部署&&model抽离

    你不知道的前端 MVVM 模式中的数据层(万字长文,教你造轮子) 实现了 Model 层抽离的全部想法, 后端返回的接口--model(错误处理,返回统一格式,洗数据,缓存)--再拿这个处理过的数据 ...

  7. logmein

    打开以后发现就是简单的字符串操作 关键比较 其中v7出按r转成字符 然后写出脚本进行操作 但是最后输出的结果不太对的样子 看了wp才知道以LL结尾的那个地方转为字符串以后要逆序操作,即字符串在内存中是 ...

  8. 文心一言 VS 讯飞星火 VS chatgpt (145)-- 算法导论12.1 5题

    五.用go语言,因为在基于比较的排序模型中,完成n个元素的排序,其最坏情况下需要 Ω(nlgn) 时间.试证明:任何基于比较的算法从 n 个元素的任意序列中构造一棵二又搜索树,其最坏情况下需要 Ω(n ...

  9. .NET中有多少种定时器

    .NET中至少有6种定时器,每一种定时器都有它的用途和特点.根据定时器的应用场景,可以分为UI相关的定时器和UI无关的定时器.本文将简单介绍这6种定时器的基本用法和特点. UI定时器 .NET中的UI ...

  10. WPF应用开发之附件管理

    在我们之前的开发框架中,往往都是为了方便,对附件的管理都会进行一些简单的封装,目的是为了方便快速的使用,并达到统一界面的效果,本篇随笔介绍我们基于SqlSugar开发框架的WPF应用端,对于附件展示和 ...