hive引入外部函数-java实现

这篇具有很好参考价值的文章主要介绍了hive引入外部函数-java实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引入依赖

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

源码理解

https://blog.csdn.net/qq_38783098/article/details/116092731

编写函数

注意必须要继承GenericUDF 类

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.primitive.PrimitiveObjectInspectorFactory;

public class SimilarEval extends GenericUDF {
    /**
     * 初始化方法,一般用来校验数据参数个数,返回值是int类型的PrimitiveObjectInspectorFactory
     * @param objectInspectors
     * @return
     * @throws UDFArgumentException
     */

    @Override
    public ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException {
        if (objectInspectors.length != 2){
            //判断参数个数是否为2,抛出异常
            throw new UDFArgumentException("参数个数必须为2,请重新输入");
        }
        return PrimitiveObjectInspectorFactory.javaIntObjectInspector; // 注意这个的返回值,是针对evaluate函数的结果返回值
    }

    /**
     * 业务逻辑处理方法
     * @param
     * @return
     * @throws HiveException
     */

    @Override
    public Object evaluate(DeferredObject[] deferredObjects) throws HiveException {
        //获取输入的参数
        String targetStr = deferredObjects[0].get().toString();
        String sourceStr = deferredObjects[1].get().toString();
        //判断输入数据是否为null,如果为null,返回0
        if (targetStr == null || sourceStr == null){
            return 0;
        }else{
            //输入数据不为null,进行业务处理
            int tar_len = targetStr.length();
            int b = 0;
            for (int i = 0; i < tar_len; i++) {
                String tmpChar = targetStr.substring(i,i+1);
                int a = sourceStr.indexOf(tmpChar);
                if (a >= 0){
                    a+=1;
                    b = b +1;
                } else{
                    a = 0;
                }
            }
            int result = (int) Math.round((b*100)/(double)tar_len);
            return result;
        }
    }

    /**
     *
     * @param strings
     * @return
     */
    @Override
    public String getDisplayString(String[] strings) {
        return "";
    }
}

项目结构

hive引入外部函数-java实现

打成jar包,并上传到linux服务器,将jar包添加到hive指定路径

# jar 包上传
hdfs dfs -put de_encry-2.0-SNAPSHOT.jar hdfs://drmcluster/stq/ltdq/jars/
# 指定jar 路径
add jar hdfs:/stq/ltdq/jars/SimilarEval-1.0-SNAPSHOT.jar;
# 创建函数
create function similar_eval as 'SimilarEval';
# 展示函数
show functions;

使用效果

hive引入外部函数-java实现

可能会出现的报错

ERROR ExecuteStatement: Error operating ExecuteStatement: org.apache.spark.sql.AnalysisException: No handler for UDF/UDAF/UDTF 'de_encry': java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer; line 1 pos 7

原因:这个就是String 转换层 Integer出问题了,主要是initialize方法返回值 是integer值,evaluate必须返回是integer值。文章来源地址https://www.toymoban.com/news/detail-506757.html

到了这里,关于hive引入外部函数-java实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java启动jar包引入外部配置文件

    前提: 打出来的jar中已经包含了各个application-xxx.yml文件,jar所在位置也引入了外部的application-test.yml。 目的:运行时,希望使用的时外部 application-test.yml  文件。 使用了以下命令: 可以启动,但是,使用的时jar包里面的application-test.yml配置,而不是外部的application-test.yml文

    2024年02月12日
    浏览(37)
  • 数据依赖和控制依赖 Data Dependence and Contol Dependence

    数据依赖和控制依赖分析是许多优化的重要工具,比如指令调度、激进死代码删除(ADCE)等。 数据依赖是数据流之间的一种依赖,主要包括四种(参考鲸书)。 1.流依赖/真依赖( flow/true dependence ):S1定义了一个值,随后S2使用了这个值。记 S 1   δ f   S 2 S1 delta^f S2 S 1

    2024年02月09日
    浏览(51)
  • Spring6-IoC(Inversion of Control)控制反转和DI(Dependency Injection)依赖注入,手动实现IOC

    Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为 Java 语言的 反射机制 。简单来说, 反射机制指的是程序在运行时能够获取自身

    2024年02月09日
    浏览(55)
  • 【196】JAVA8 用 DOM 方式的 API 解析XML文件,无需引入第三方依赖。

    JAVA8 可以使用标准的 DOM 方式的 API 来编写代码解析 XML 文件,无需引入第三方依赖。下面是两个测试用的 XML 文件: test.xml test2.xml 负责接收所有信息的 AllDataDTO.java 负责接收用户信息的 AllDataUserDTO.java 处理 XML 文件的工具类,XmlUtils.java 用于测试效果的类 Main.java 输出结果:

    2024年01月22日
    浏览(32)
  • 什么是依赖注入(Dependency Injection)?

    依赖注入(Dependency Injection,简称DI)是一种设计模式,用于实现类之间的解耦和依赖关系的管理。它通过将依赖关系的创建和维护责任转移到外部容器中,使得类不需要自己实例化依赖对象,而是由外部容器动态地注入依赖。 传统的对象创建方式往往由类自身负责创建和管

    2024年02月15日
    浏览(30)
  • 【Python开发】FastAPI 07:Depends 依赖注入

    在 FastAPI 中, Depends 是一个依赖注入系统,用于注入应用程序中所需的依赖项,通过 Depends ,我们可以轻松地将依赖项注入到 FastAPI 路由函数中。简单来说,Depends 依赖注入的目的就是将代码重复最小! 目录 1 Depends 使用 1.1 依赖注入介绍 1.2 demo 1.3 OpenAPI 集成 2 不同依赖项

    2024年02月08日
    浏览(36)
  • vue-package.json中的dependencies(生产依赖)和devDependencies(开发依赖)

     以下所有安装命令都会对node_modules生效,即安装都会安装到node_modules中,删除也会中从node_modules中删除 1、不会添加到package.json中 2、会添加到package.json的dependencies中 ,build时会打进去, 3、会添加到package.json的devDependencies中   参考package.json中的dependencies(生产依赖)和devD

    2024年02月13日
    浏览(36)
  • 【VC++开发必备神器 -- Dependencies,查看依赖库DLL,支持win10,比depends更好用】

    软件之Dependencies,不同于depends 1、微软官方有提供depends,可以查看exe文件的依赖库,仅适用于winxp/win7/win8,但是不能用于win10,会卡死报错. 官网下载:Dependency Walker (depends.exe) Home Page 左上角第一个窗口是Dll信息窗口,显示程序所需的Dll模块。 如何使用Depends.exe查看dll动态链

    2024年02月05日
    浏览(37)
  • Angular 17+ 高级教程 – Dependency Injection 依赖注入

    本来是想先介绍 Angular Component 的,但 Component 里面会涉及到一些 Dependency Injection (简称 DI) 的概念,所以还是先介绍 DI 吧。 温馨提醒:如果你对 JS class、prototype 不太熟悉的话,建议你先看这篇 JavaScript – 理解 Object, Class, This, Prototype, Function, Mixins   首先我们有一个 class Ser

    2024年03月09日
    浏览(49)
  • IDEA库(Libraries)和模块依赖(Dependencies)详解

    库是模块可以依赖的已编译代码的集合。在IntelliJ IDEA中,可以在三个级别上定义库: 全局 (可用于许多项目), 项目 (可用于 项目 中的所有模块)和 模块 (可用于一个模块) 简单来说,IDEA中的库(Libraries)就是用来存放外部jar包,我们的项目或模块需要某些jar包时,

    2024年01月25日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包