首页 > 编程语言 >HIVE使用java生成自定义(UDF)函数,并在hive命令中使用

HIVE使用java生成自定义(UDF)函数,并在hive命令中使用

时间:2024-04-23 13:56:26浏览次数:30  
标签:java 自定义 hadoop hive udf HIVE str apache org

 

 

创建一个maven项目(不要用springboot)

 

 

引入依赖

  <!--添加hive依赖 -->
        <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-exec</artifactId>
            <version>3.1.1</version>
        </dependency>

        <!--添加hadoop依赖  2.7.3-->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>3.1.1</version>
        </dependency>

增加打包插件,因为我们这个jar最后要把用到的依赖都要打进去 所以要设置下

 <!-- 打包配置 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.0.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass></mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id> <!-- this is used for inheritance merges -->
                        <phase>package</phase> <!-- 指定在打包节点执行jar包合并操作 -->
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

 

 

 

编写自定义函数类

这里伪代码 输出长度

MyStrLengthUDF.java

import org.apache.hadoop.hive.ql.exec.Description;
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.PrimitiveObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
import org.apache.hadoop.io.Text;

/**
 */
@Description(name = "my_str_length_udf",
        value = "",
        extended = "计算字符串的长度" +
                "  ")
public class MyStrLengthUDF extends GenericUDF {


    @Override
    public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {
        // 确保输入参数只有一个,并且是字符串类型
        if (arguments.length != 1 || !arguments[0].getCategory().equals(ObjectInspector.Category.PRIMITIVE)
                || !((PrimitiveObjectInspector) arguments[0]).getPrimitiveCategory().equals(PrimitiveObjectInspector.PrimitiveCategory.STRING)) {
            throw new UDFArgumentException("my_str_length_udf() takes exactly one string argument");
        }
        // 设置输出的ObjectInspector为字符串类型
        return PrimitiveObjectInspectorFactory.writableStringObjectInspector;
    }

    @Override
    public Object evaluate(DeferredObject[] deferredObjects) throws HiveException {
        String str = deferredObjects[0].get().toString();
        if (str == null) {
            return null;
        }
        //得出字符串的长度 并输出,这里为了演示 所以用的是输出字符串,
        return new Text(str.length()+"");
    }

    @Override
    public String getDisplayString(String[] strings) {
        return getStandardDisplayString("my_str_length_udf", strings);
    }
}

 

可以在evaluate()方法中编写自己的逻辑

my_str_length_udf :这个是自定义函数的名称,就是我们 到时候执行hive的sql时候 使用的

 

然后执行打包命令

最后会生成这个文件 这个里面会含有我们依赖的依赖包

 

因为我们要在hive里面使用,我这里上传到hdfs中 ,根据自己的选择来

hdfs上传命令

hdfs dfs -put /home/udf-1.0-SNAPSHOT-jar-with-dependencies.jar   /udf/

这个表示上传到/udf/路径中 根据自己的来

然后登录hive

一般是用 命令 然后输入一个可以创建自定义函数的用户

beeline

 

创建udf函数 (临时创建)  这种方式服务重启就没有

create function my_str_length_udf as 'com.hive.udf.MyStrLengthUDF' using jar 'hdfs:///udf/udf-1.0-SNAPSHOT-jar-with-dependencies.jar' ;

my_str_length_udf:这个就是上面代码里面的函数名

com.hive.udf.MyStrLengthUDF: 这里就是包路径 我们上面那个类的完整包路径

 

 

执行之后打印ok 表示添加成功

可以使用hive的命令看是否添加了 查看所有自定义函数

SHOW FUNCTIONS;

可以找到我们加的就行

 

接着使用hive命令 执行

例如

select my_str_length_udf("123")

然后结果

 

标签:java,自定义,hadoop,hive,udf,HIVE,str,apache,org
From: https://www.cnblogs.com/pxblog/p/18152720

相关文章

  • maixcam部署自定义模型
    maixcam部署yolov5s自定义模型本博客将向你展示零基础一步步的部署好自己的yolov5s模型(博主展示的是安全帽模型),训练就引用我自己之前写过的,已经训练好的可以跳过该部分,其中有部分不一样。获得自定义训练得到的yolov5sonnx模型准备自定义数据集(博主用的是VOC数据集)数据集......
  • JavaScript注释:单行注释和多行注释详解
    为了提高代码的可读性,JS与CSS一样,也提供了注释功能。JS中的注释主要有两种,分别是单行注释和多行注释。在编程的世界里,注释是那些默默无闻的英雄,它们静静地站在代码的背后,为后来的维护者、为未来的自己,甚至是为那些偶然间翻阅你代码的开发者提供着不可或缺的信息。今天,我们就来深......
  • Cassandra节点重启失败 java.lang.RuntimeException: A node with address *** alread
    问题杀死一个节点后重启报节点已存在:java.lang.RuntimeException:Anodewithaddress***alreadyexists,cancellingjoin.Usecassandra.replace_addressifyouwanttoreplacethisnode.解决方法到另一个节点Cassandra的bin目录./nodetoolstatus查看需要重启......
  • fastjson导致的程序崩溃:A fatal error has been detected by the Java Runtime Enviro
    ##AfatalerrorhasbeendetectedbytheJavaRuntimeEnvironment:##EXCEPTION_ACCESS_VIOLATION(0xc0000005)atpc=0x000001da4d3ab6b3,pid=15996,tid=0x0000000000006478##JREversion:Java(TM)SERuntimeEnvironment(8.0_361)(build1.8.0_361-b09)......
  • Java中的static关键字解析
    一.static关键字的用途二.static关键字的误区三.常见的笔试面试题一.static关键字的用途在《Java编程思想》P86页有这样一段话:“static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,......
  • 认识一下JavaScrip中的元编程
    本文分享自华为云社区《元编程,使代码更具描述性、表达性和灵活性》,作者:叶一一。背景去年下半年,我在微信书架里加入了许多技术书籍,各种类别的都有,断断续续的读了一部分。没有计划的阅读,收效甚微。新年伊始,我准备尝试一下其他方式,比如阅读周。每月抽出1~2个非连续周,完整阅读一......
  • Java switch() case中的switch可用的数据类型 byte,shor,int ,string ,char不能是long
    Javaswitch()case中的switch可用的数据类型   byte,shor,int,string,char1.swtich()里面必须是int和enum--即枚举类型。2.short、char或者byte他会自动转换为int的。。3.long不能自动转换为int,因为long比int范围大..可能会丢失精度..4.java把string也'转化'成int了,用......
  • javascript入门
    目录javascript入门js简介与导入方式导入方式js基本语法变量数据类型条件语句循环语句函数事件DOM操作javascript入门ps:本篇章只介绍js语言最基本的使用,是偏向入门的文档,想要熟练掌握js还是需要多读其他技术文档js简介与导入方式首先javascript与java没有任何关系!Jav......
  • Java泛型如何对属性操作
    对于多个类型相似的操作,如何实现统一处理,简化操作。例如,现在由多个类定义,类定义中都包含客户编号,但是缺少客户名称。如果采用常规的方式,我对于需要展示客户名称的场景,需要对每个类的每个场景去处理,来根据客户编号获取客户信息,并设置客户名称。但是这种方式对存在很多的冗余代码......
  • 拥抱 invokedynamic,在 Java agent 中驯服类加载器
    前言在开发项目的agent时,找了很多类隔离加载的解决方案,最终参照开源项目实现,采用了ElasticAPMJavaagent的方案。以下为本方案的核心说明文章。翻译正文ByteBuddy最棒的一点是,它允许您编写Javaagent,而无需手动处理字节代码。agent作者只需用纯Java编写要注入的代码,......