自定义UDF函数

article/2025/9/27 2:55:31

自定义函数案例:

文章目录

    • 自定义UDF函数
      • 1.需求
      • 2.前期maven工程准备
      • 3.编程实现
      • 4.导包
      • 5.导入hive中
    • 自定义UDTF函数
      • 1.需求
      • 2.编程实现
      • 3.导入hive中

自定义UDF函数

1.需求

自定义一个UDF实现计算给定字符串的长度例如

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8ZqHfWL7-1642945083980)(C:\Users\Admin\AppData\Roaming\Typora\typora-user-images\image-20220123150507709.png)]

2.前期maven工程准备

创建一个maven工程,导入依赖

<dependencies>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>3.1.2</version>
</dependency>
</dependencies>

3.编程实现

编写实现类

package com.yingzi.hive1;import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
/*** @author 影子* @create 2022-01-23-14:08**//*** 自定义UDF函数,继承GenericUDF类* 需求:计算指定字符串的长度*/
public class MyStringLength extends GenericUDF {/**** @param objectInspectors 输入参数类型的鉴别器对象* @return 返回值类型的鉴别器对象* @throws UDFArgumentException*/@Overridepublic ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException {//  判断输入参数的个数if (objectInspectors.length != 1){throw new UDFArgumentLengthException("Input Args Length Error!!!");}//  判断输入参数的类型if (!objectInspectors[0].getCategory().equals(ObjectInspector.Category.PRIMITIVE)){throw new UDFArgumentTypeException(0,"Input Args Type Error!!!");}//  函数本身返回值为int,需要返回int类型的鉴别器对象return  PrimitiveObjectInspectorFactory.javaIntObjectInspector;}/*** 函数的逻辑处理* @param deferredObjects 输入的参数* @return 返回值* @throws HiveException*/@Overridepublic Object evaluate(DeferredObject[] deferredObjects) throws HiveException {if (deferredObjects[0].get() == null){return 0;}return deferredObjects[0].get().toString().length();}@Overridepublic String getDisplayString(String[] strings) {return "";}
}

4.导包

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FOXNHmjH-1642945083982)(C:\Users\Admin\AppData\Roaming\Typora\typora-user-images\image-20220123150806976.png)]

将上述包,放到虚拟机的hive/lib下

5.导入hive中

1)将jar包添加到hive的calsspath

add jar /opt/module/hive/libHIVE_test-1.0-SNAPSHOT.jar

2)创建临时函数与开发好的 java class 关联

create temporary function my_len as "com.yingzi.hive1.MyStringLength";

3)验证是否导入成功!!!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8I8ghPNA-1642945083983)(C:\Users\Admin\AppData\Roaming\Typora\typora-user-images\image-20220123151144648.png)]

自定义UDTF函数

1.需求

自定义一个 UDTF 实现将一个任意分割符的字符串切割成独立的单词,例如:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DfYV4ICB-1642945083983)(C:\Users\Admin\AppData\Roaming\Typora\typora-user-images\image-20220123153505788.png)]

2.编程实现

package com.yingzi.hive1;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;/*** @author 影子* @create 2022-01-23-15:14**/
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[] objects) throws HiveException {//1获取原始数据String object = objects[0].toString();//2获取数据传入的第二个参数,此处为分隔符String splitKey = objects[1].toString();//3将原始数据按照传入的分隔符进行切分String[] fields = object.split(splitKey);//4遍历切分后的结果,并写出for (String field : fields) {//集合为复用的,首先清空集合outList.clear();//将每一个单词添加至集合outList.add(field);//将集合内容写出forward(outList);}}@Overridepublic void close() throws HiveException {}
}

3.导入hive中

同前面一样


http://chatgpt.dhexx.cn/article/hSKUp44e.shtml

相关文章

Hive自定义UDF函数详解

Hive自定义UDF函数详解 一、UDF概述二、UDF种类三、如何自定义UDF四、自定义实现UDF和UDTF4.1 需求4.2 项目pom文件4.3 Hive建表测试及数据4.4 UDF函数编写4.5 UDTF函数编写4.6 UDTF使用 一、UDF概述 UDF全称&#xff1a;User-Defined Functions&#xff0c;即用户自定义函数&…

Hive UDF简单函数

概念 在Hive中&#xff0c;用户可以自定义一些函数&#xff0c;用于扩展HiveQL的功能&#xff0c;而这类函数叫做UDF&#xff08;用户自定义函数)。UDF分为两大类&#xff1a;UDAF&#xff08;用户自定义聚合函数&#xff09;和UDTF&#xff08;用户自定义表生成函数)。  UDF…

大数据Hive篇--UDF函数

什么是UDF: 它是User defined Function的简写&#xff0c;意思是用户自定义方法 为什么要用UDF&#xff1f; hive自带了一些函数&#xff0c;比如&#xff1a;max、min 等&#xff0c;但是自带的函数数量有限&#xff0c;所以hive提供给用户自定义函数的功能。 udf 函数可以…

《C#入门详解》刘铁猛——Lesson20-21事件

其实事件一般就是在界面程序中应用&#xff0c;所以这里讲的不如WPF这种的实用。

《C#入门详解》刘铁猛——Lesson1-2 IDE、各种应用程序

编程学习路径&#xff1a;语言——类库——框架 参考资料&#xff1a;离线MSDN文档&#xff0c;C#语言定义文档&#xff0c;推荐书籍—C# in a nutshell&#xff1b;其中&#xff0c;C#语言定义文档知识点会串的比较多&#xff0c;不建议详读。 使用MSDN&#xff1a;光标选中…

《C#入门详解》刘铁猛——Lesson8-9 方法的定义、调用与调试

方法命名&#xff1a;使用动词或者动词短语&#xff1b;使用PASCAL规则&#xff0c;即所有单词首字母大写。 静态类型的方法不是实例的方法&#xff0c;是类的方法&#xff0c;因此&#xff0c;实例不能调用静态方法&#xff0c;只能用类调用静态方法&#xff0c;示例程序如下&…

《C#入门详解》刘铁猛——Lesson17字段、属性、索引器、常量

属性代码示例&#xff1a; 以上代码演示了字段由get-set方法对演化成为属性的过程。 prop连敲两下Tab键&#xff0c;是属性声明的快捷键。 强调以下&#xff1a; 很少使用索引器。 声明和使用常量&#xff1a;

《C#入门详解》刘铁猛——Lesson27-28类的重写、多态、抽象类、开闭原则

重写、多态——子类对父类的纵向扩展&#xff0c;就是方法的版本升级。 override——重写&#xff0c;子类对父类成员的版本更新。 virtual——override 下面的例子就是多态——多态就是使用一个父类的变量引用一个子类的实例&#xff0c;当调用方法时&#xff0c;会顺着继承链…

《C#入门详解》刘铁猛——Lesson19委托

自定义委托类型&#xff1a; 模板方法实例&#xff1a; 回调方法示例&#xff1a; 多播委托示例&#xff1a; 同步调用&#xff08;串行&#xff0c;单线程&#xff09;示例&#xff1a; 多播委托也是同步调用&#xff1a; 隐式的异步调用示例&#xff1a; 执行结果发生了资源…

《C#入门详解》刘铁猛——Lesson18传值\输出\引用\数组\具名\可选参数、扩展方法

x是101&#xff0c;y是100 在声明函数的时候带有默认值。 静态函数&#xff0c;第一个参数加this修饰符&#xff0c;就是一个扩展方法。调用的时候可以看见向下的小箭头。

刘铁猛C#语言入门详解——学习笔记014、15、16(2)

using System; using System.Collections.Generic; namespace ConsoleApp2 {class Program{static void Main(string[] args){//c#语言对表达式的定义&#xff1a;a sequence of one or more operands and zero or more operators can be evaluated to a single value object m…

《深入浅出WPF》-刘铁猛学习笔记——XAML

这里有个目录 XAML是什么&#xff1f;导人程序集和引用其中的名称空间XAML的树型结构Attribute (特性、标记、属性)Property (属性)属性赋值字符串赋值使用属性元素( Property Element)进行复杂赋值 XAML 注释后记 XAML是什么&#xff1f; XAML是微软公司创造的一种开发语言&a…

《C#入门详解》刘铁猛——Lesson31泛型、partial类、枚举、结构体

泛型类如下&#xff1a; 泛型接口&#xff0c;太常用了&#xff0c;如下&#xff1a; 实现这个泛型接口的类&#xff0c;也是泛型类&#xff0c;如下&#xff1a; 数据结构&#xff0c;基本上都是泛型的。 方法也可以是泛型的&#xff0c;而且泛型方法更常用&#xff0c;泛型方…

《C#入门详解》刘铁猛——Lesson10-11-12 操作符

纵向往下走&#xff0c;优先级依次降低。 []操作符声明数组&#xff1a; typeof操作符的用法&#xff1a; var声明隐式类型变量&#xff1a; new操作符声明实例&#xff1a; delegate——委托&#xff0c;使用该操作符声明一个匿名方法的示例如下&#xff1a; delegate现在已过…

《C#入门详解》刘铁猛——Lesson22-23LINQ

事件是基于委托的&#xff0c;事件是对委托类型的包装&#xff0c;事件是语法糖&#xff0c;委托类型才是完整格式&#xff0c;保护委托类型不会被外部随便调用。 就像属性是基于字段的&#xff0c;属性是字段的包装&#xff0c;用于防止字段被外部乱用。 三年后的视频。。。 …

刘铁猛《C#语言入门详解》——委托详解

委托详解 事件 using System; using System.Threading;namespace ConsoleAPP1 {class Program{static void Main(string[] args){Customer customer = new Customer(); //s事件拥有者Waiter waiter = new Waiter(); //事件的响应者// += 事件的订阅 customer.Order 事件 …

C#语言入门详解---委托(刘铁猛)

委托:函数指针的升级版,可以类比C语言中的函数指针进行理解 变量的本质就是以变量名所对应的内存地址为起点的一段内存,这段内存中存储的就是变量的数据,这段内存的大小由变量的数据类型决定。 函数代表算法,函数的本质是以函数名所对应的内存地址为起点的一段内存中,这…

刘铁猛《C#语言入门详解》1——详解类型、变量与对象

详解类型、变量与对象——上 C#是强类型语言&#xff0c;可使用dynamic实现弱类型语言的赋值操作&#xff1a; 数据类型 栈溢出&#xff1a;栈很小&#xff0c;分配过多内存会爆掉 内存监视器&#xff1a;winR,命令为&#xff1a;perform 详解类型、变量与对象——下 值类型在…

【C#】刘铁猛-C#语言入门详解听课笔记

叨叨在前&#xff1a; 这个视频共33集&#xff0c;油管和B站都可以看&#xff0c;B站有说有第二版本&#xff0c;但我在油管刘老师主页上没看见。 01 C#语言简介&#xff0c;搭建开发环境【略】 1、C#主要用来编写应用程序的 2、写程序步骤&#xff1a;编辑→编译[把语言转成…