UDF和GenericUDF区别

article/2025/9/2 4:14:55

目录

UDF

GenericUDF


Java开发转了大数据,竟然被拉去做了非结构的ETL抽取,真的是比做后端伤脑筋,没有可借鉴的框架,只能根据数据进行抽取,第一份大数据实习,写完抽取代码后,需要写成UDF和UDTF进行使用。

简单意思:

UDF: 一对一,输入一笔数据输出一笔数据

UDTF:一对多,输入一笔数据输出多笔数据 (接受0个或多个输入然后产生多列或多行输出。)

UDAF:多对一,输入多笔数据输出一笔数据

记录一下UDF和GenericUDF的区别:

UDF属于基础的UDF:

简单的udf实现很简单,只需要继承udf,然后实现evaluate()方法就行了。evaluate()允许重载。

UDF

对于自定义函数现在需要进行总结一下:

pom文件:主要为打包文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>UDF</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><dependencies><dependency><groupId>org.apache.spark</groupId><artifactId>spark-core_2.11</artifactId><version>2.3.0</version><scope>provided</scope></dependency><dependency><groupId>org.apache.spark</groupId><artifactId>spark-hive_2.11</artifactId><version>2.3.0</version><scope>provided</scope></dependency></dependencies><build><sourceDirectory>src</sourceDirectory><defaultGoal>compile</defaultGoal><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.5.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><plugin><artifactId>maven-assembly-plugin</artifactId><configuration><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin></plugins></build>
</project>

package com.demo;import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDF;/*** 最简单的UDF 继承 org.apache.hadoop.hive.ql.exec.UDF*/
@Description(name = "wordUDF",value = "_FUNC_(String word) - Returns result",extended ="Example:\\n  > SELECT _FUNC_(\\'你好\\') FROM src LIMIT 1;\\n  \\'2022新年快乐:你好\\'\""
)public class WordSingleUDF extends UDF {public String evaluate(String args) {return "2022新年快乐:"+args;}public static void main(String[] args) {System.out.println(new WordSingleUDF().evaluate("你好"));}}

进行打包上传:

1. add jar /home/zhaohai.li/tmp/UDF-1.0-SNAPSHOT-jar-with-dependencies.jar

2. create temporary function udf_word as 'com.demo.WordSingleUDF';

3. select udf_word('hello') 

显示:

2022新年快乐:hello

GenericUDF

这个函数需要进行实现多个方法

 GenericUDF的有点 可以处理复杂的数据类型,所以它能处理更为复杂的数据类型场景。

 

 在进行继承GenericUDF 时需要进行实现三个方法:

必须实现的函数:ObjectInspector initialize(ObjectInspector[] arguments)  //初始化操作,在函数进行初始化的时候会执行,其他时间不执行
Object evaluate(DeferredObject[] arguments) //进行业务计算逻辑,处理具体的数据
String getDisplayString(String[] children)//进行函数描述结果的显示,只有当函数执行一场才会显示

其余的函数:

configure(MapredContext context) //在函数初始化之前,进行设置mapContext

package main.java.com.demo;import org.apache.hadoop.hive.ql.exec.MapredContext;
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;import java.util.ArrayList;
import java.util.Date;public class WordUDF extends GenericUDF {private static int mapTasks = 0;private static String init = "";private transient ArrayList ret = new ArrayList();@Overridepublic void configure(MapredContext context) {System.out.println(new Date() + "configure mapredContext");if (null != context) {//从jobConf中获取map数mapTasks = context.getJobConf().getNumMapTasks();}System.out.println(new Date() + "######## mapTasks [" + mapTasks + "] ..");}/*** 初始化函数  能够定义返回的数据类型** @param objectInspectors* @return* @throws UDFArgumentException*/@Overridepublic ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException {System.out.println("1. init start:udfName" + this.getUdfName() + new Date());//初始化文件系统,可以在这里初始化读取文件等init = "init";//定义函数的返回类型为java的ListObjectInspector returnOI = PrimitiveObjectInspectorFactory.getPrimitiveJavaObjectInspector(PrimitiveObjectInspector.PrimitiveCategory.STRING);return ObjectInspectorFactory.getStandardListObjectInspector(returnOI);}/*** 评估计算业务逻辑* @param args* @return* @throws HiveException*/@Overridepublic Object evaluate(DeferredObject[] args) throws HiveException {System.out.println("2. deal with the data process " + new Date());ret.clear();if(args.length < 1) return ret;//获取第一个参数String str = args[0].get().toString();String[] s = str.split(",",-1);for(String word : s) {ret.add(word);}return ret;}@Overridepublic String getDisplayString(String[] strings) {return "Usage: Lxw1234GenericUDF(String str)";}public static void main(String[] args) {}
}

UDTF

package main.java.com.demo;import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;import java.util.ArrayList;
import java.util.List;public class MyUDTF extends GenericUDTF {private ArrayList<String> outList = new ArrayList<>();@Overridepublic StructObjectInspector initialize(StructObjectInspector argOIs) throws UDFArgumentException {//1.定义输出数据的列名和类型List<String> fieldNames = new ArrayList<>();List<ObjectInspector> fieldOIs = new ArrayList<>();//2.添加输出数据的列名和类型fieldNames.add("lineToWord");fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs);}@Overridepublic void process(Object[] args) throws HiveException {//1.获取原始数据String arg = args[0].toString();//2.获取数据传入的第二个参数,此处为分隔符String splitKey = args[1].toString();//3.将原始数据按照传入的分隔符进行切分String[] fields = arg.split(splitKey);//4.遍历切分后的结果,并写出for (String field : fields) {//集合为复用的,首先清空集合outList.clear();//将每一个单词添加至集合outList.add(field);//将集合内容写出forward(outList);}}@Overridepublic void close() throws HiveException {}}

 

UDAF

 UDAF已经失效 需要去实现 implement 

org.apache.hadoop.hive.ql.udf.generic.GenericUDAFResolver2 或者 extend org.apache.hadoop.hive.ql.udf.generic.AbstractGenericUDAFResolver

能看到实际上

org.apache.hadoop.hive.ql.udf.generic.AbstractGenericUDAFResolver也是实现的org.apache.hadoop.hive.ql.udf.generic.GenericUDAFResolver2

 

那我们直接进行继承父类  AbstractGenericUDAFResolver (自己可做选择)

要先了解UDAF的四个阶段,定义在GenericUDAFEvaluator的Mode枚举中:


COMPLETE:如果mapreduce只有map而没有reduce,就会进入这个阶段;
PARTIAL1:正常mapreduce的map阶段;
PARTIAL2:正常mapreduce的combiner阶段;
FINAL:正常mapreduce的reduce阶段;
 


http://chatgpt.dhexx.cn/article/06nejPaw.shtml

相关文章

URDF教程

创建自己的URDF文件 1.1创建树形结构文件 在这部分教程中要创建的将是下面的图形所描述的机器人的urdf文件 图片中这个机器人是一个树形结构的。让我们开始非常简单的创建这个树型结构的描述文件&#xff0c;不用担心维度等的问题。创建一个my_robot.urdf文件&#xff0c;…

UDF 提权

肚子难受了两天&#xff0c;躺了两天 关于 UDF &#xff0c;我当时第一想到的是 sqlmap 里的 -os-shell 这两者之间又有怎么样的区别&#xff1f; 经过我查了一番资料 UDF 全称为 User Defined Functions ,翻译过来就是用户可自定义函数. UDF 适用于只知道root 账户密码&a…

MySQL UDF 提权

概述 UDF 全称 User Defind Function&#xff08;用户自定义函数&#xff09;&#xff0c;用户通过自定义函数可以实现在 MySQL 中无法方便实现的功能&#xff0c;其添加的新函数都可以在 SQL 语句中调用&#xff0c;就像调用本机函数 version () 一样方便。 UDF 提权是通过这…

udf提权

udf提权 什么是udf udf “user defined function”,即‘用户自定义函数’。是通过添加新函数&#xff0c;对MYSQL的功能进行扩充&#xff0c;性质就像使用本地MYSQL函数如abs()或concat()。udf在mysql5.1以后的版本中&#xff0c;存在于’mysql/lib/plugin’目录下&#xff…

URDF

Solidworks模型转化为URDF文件格式三连杆机械臂示例逆运动学 https://blog.csdn.net/gpeng832/article/details/73917487 关于SolidWorks导出URDF模型的总结 https://blog.csdn.net/mt_lixinzeng/article/details/80268572 Rviz: RobotModel --Status: Error :如果关节是活动…

Mysql之UDF提权

前言 mysql提权的几种方式 udf提权&#xff08;常用&#xff09;mof提权开机启动脚本&#xff08;启动项提权&#xff09; 提权目的&#xff1a;mysql权限 —> 操作系统权限 UDF提权 有时候我们通过一些方式获取了目标主机mysql的用户名和密码&#xff0c;并且可以远程连…

UDAF和UDF的介绍

目录 UDF介绍 UDAF简介 关于UDAF的一个误区 使用UDF 在SQL语句中使用UDF 直接对列应用UDF&#xff08;脱离sql&#xff09; UDAF使用 继承UserDefinedAggregateFunction 继承Aggregator UDF介绍 UDF&#xff08;User Define Function&#xff09;&#xff0c;即用户自…

FLUENT UDF并行化(1)

来源&#xff1a;ANSYS FLUENT UDF帮助文档&#xff0c;翻译自用&#xff0c;如有错误&#xff0c;欢迎指出&#xff01; 本章概述了并行ANSYS Fluent的用户定义函数&#xff08;UDF&#xff09;及其用法。有关并行UDF功能的详细信息&#xff0c;请参见以下部分&#xff0c;本…

FLUENT UDF并行化(2)

来源&#xff1a;ANSYS FLUENT UDF帮助文档&#xff0c;翻译自用&#xff0c;如有错误&#xff0c;欢迎指出&#xff01; 本章概述了并行ANSYS Fluent的用户定义函数&#xff08;UDF&#xff09;及其用法。有关并行UDF功能的详细信息&#xff0c;请参见以下部分&#xff0c;本…

udf开发入门(python udf、hive udf)

开发前的声明 udf开发是在数据分析的时候如果内置的函数解析不了的情况下去做的开发&#xff0c;比方说你只想拆分一个字段&#xff0c;拼接一个字段之类的&#xff0c;就不要去搞udf了&#xff0c;这种基本的需求自带函数完全支持&#xff0c;具体参数可参考文档&#xff1a; …

UDF的入门科普

新入门的小伙伴们好像对udf有一些疑问&#xff0c;那么今天就给大家整理一些udf的学习资料供大家参考。&#xff08;公众号&#xff1a;刘华强仿真笔记&#xff09; 01 UDF的基本概念 UDF的定义? UDF 是用户自己用C语言写的一个函数&#xff0c;可以和FLUENT动态链接 用UDF…

FLUENT中初识UDF——UDF的简单使用(1)

FLUENT中初识UDF——UDF的简单使用&#xff08;1&#xff09; 注意&#xff1a;不包含其他ANSYS基本操作流程&#xff01;&#xff01;&#xff01;1&#xff1a;UDF的编写&#xff1a;2&#xff1a;ANSYS中导入UDF函数&#xff1a;2.1&#xff1a;首先打开Fluent&#xff0c;导…

对window的注册表进行优化

Regclean pro是一款优秀的注册表扫描、清理工具&#xff0c;由微软金牌合作伙伴Systweak开发。 它具有强大的Windows注册表检测及修复功能&#xff0c;可以帮助用户轻松而有效的清理、修复Windows 系统注册表中缺省的、被破坏的或残缺的系统参数&#xff0c;轻松提升系统性能。…

Windows注册表基本管理配置

一.注册表优化 注册表的优化分为几点: 1.系统安装是产生的无用信息 &#xff08;1&#xff09; 删除多余的时区 路径&#xff1a;计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones 删除除了China Standard Time中国时区以外的其他时区…

Windows与网络基础-19注册表维护与优化

目录 一、注册表维护 1.1注册表被破坏后的常见现象 1.2注册表被破坏的原因 1.3备份注册表 1.4恢复注册表 1.5锁定和解锁注册表 二、注册表的优化 2.1删除多余的DLL文件 2.2安装卸载应用程序的垃圾信息 2.3系统安装时产生的无用信息 2.3.1删除多余时区&#xff08;必…

Win7注册表优化工具箱

软件名称&#xff1a;Win7注册表优化工具箱 软件版本&#xff1a;1.0.0.0 软件大小 1.04MB 适用环境&#xff1a; win7 软件性质&#xff1a; 国产软件 - 系统工具 - 优化设置 下载地址 http://pan.baidu.com/share/link?shareid104303&uk4160867570# 本文转自hai…

windows注册表

第一课 注册表基础 一、什么是注册表 注册表是windows操作系统、硬件设备以及客户应用程序得以正常运行和保存设置的核心“数据库”&#xff0c;也可以说是一个非常巨大的树状分层结构的数据库系统。 注册表记录了用户安装在计算机上的软件和每个程序的相互关联信息&#…

玩转电脑|盘点一下Windows 10 注册表系统优化【 InsCode Stable Diffusion 美图活动一期】

目录 什么是注册表 组成 Windows 注册表的层次结构 如何在 Windows 11/10 中创建注册表项 1、使用注册表编辑器 2、使用命令行 3、使用记事本创建REG文件 注意&#xff1a;在本文中主要就是使用记事本创建REG文件来修改。 注册表代码 修改状态栏透明度 任务栏时间显…

计算机系统的优化具体操作,注册表优化电脑内存的详细操作步骤

注册表优化电脑内存 当我们在使用电脑出现内存不足的情况下&#xff0c;通常会选择升级内存的方式来解决相关问题。而加了一个内存条之后&#xff0c;通常你会发现运行速度并没有等到比较显著的改善。只有在运行一些大程序的时候才能感觉到有所提升。这是因为系统会照顾到使用低…

win10清理注册表的方法

如果不需要某款软件之后&#xff0c;我们将其从电脑上卸载之后&#xff0c;如果不清理干净注册表信息的话可能日积月累会对电脑运行造成影响。那么win10如何清理注册表多余信息呢&#xff1f;今天小编就教下大家win10清理注册表的方法。 具体的方法如下&#xff1a; 1、在桌面…