当前位置: 首页 > news >正文

Java实现Hive UDF详细步骤 (Hive 3.x版本,IDEA开发)

这里写目录标题

    • 前言
      • 1. 新建项目
      • 2.配置maven依赖
      • 3.编写代码
      • 4.打jar包
      • 5.上传服务器
      • 6.代码中引用

前言

老版本编写UDF时,需要继承 org.apache.hadoop.hive.ql.exec.UDF类,然后直接实现evaluate()方法即可。
由于公司hive版本比较高(3.x),这次编写UDF就采用了新的版本,继承类org.apache.hadoop.hive.ql.udf.generic.GenericUDF,实现三个方法

1. 新建项目

打开IDEA,新建一个项目,基本配置如下,Archetype选择图中所示
在这里插入图片描述

2.配置maven依赖

导入编写UDF需要用到的依赖

<dependencies><!-- https://mvnrepository.com/artifact/org.apache.hive/hive-exec --><dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>3.1.2</version><exclusions><exclusion><groupId>org.apache.commons</groupId><artifactId>commons-compress</artifactId></exclusion></exclusions></dependency>
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>8</source><target>8</target></configuration></plugin></plugins></build>

3.编写代码

目录结构可自行定义,这块不影响实际功能,代码整体框架如下
我这里代码传入三列数据,返回一列数据,入参可以判断一下是否传入数据正确,以及数据类型是否匹配
主要实现三个方法,具体内容在代码块中有说明

  1. initialize
  2. evaluate
  3. getDisplayString
public class ComputeUnitPrice extends GenericUDF {WritableHiveDecimalObjectInspector  decimalObjectInspector;//初始化方法,做一些检查@Overridepublic ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {// 判断输入参数的个数if(arguments.length !=3){throw new UDFArgumentLengthException("This UDF Only takes 3 arguments: String, String, Decimal");}ObjectInspector param1 = arguments[0];ObjectInspector param2 = arguments[1];ObjectInspector param3 = arguments[2];// 判断输入参数的类型if(!(param1 instanceof StringObjectInspector)){throw new UDFArgumentException("Param1 Type is error,Must be : String");}if(!(param2 instanceof StringObjectInspector)){throw new UDFArgumentException("Param2 Type is error,Must be : String");}
//        if(!(param3 instanceof JavaConstantHiveDecimalObjectInspector)){
//            throw new UDFArgumentException("Param3 Type is error,Must be : JavaHiveDecimal");
//        }this.decimalObjectInspector = (WritableHiveDecimalObjectInspector ) param3;//函数返回值为 Decimal,需要返回 Decimal类型的鉴别器对象return PrimitiveObjectInspectorFactory.javaHiveDecimalObjectInspector;}
}@Overridepublic Object evaluate(DeferredObject[] arguments) throws HiveException {//计算逻辑编写}//udf的说明@Overridepublic String getDisplayString(String[] children) {return "ComputeUnitPrice";}//main方法测试一下数据结果public static void main(String[] args) throws HiveException {ComputeUnitPrice computeUnitPrice = new ComputeUnitPrice();DeferredObject[] param = {new DeferredJavaObject("箱"), new DeferredJavaObject("800g*8袋/箱"), new DeferredJavaObject(100.20)};JavaDoubleObjectInspector javaDoubleObjectInspector = PrimitiveObjectInspectorFactory.javaDoubleObjectInspector;ObjectInspector stringOi = PrimitiveObjectInspectorFactory.javaStringObjectInspector;ObjectInspector doubleOi = PrimitiveObjectInspectorFactory.javaDoubleObjectInspector;computeUnitPrice.initialize(new ObjectInspector[]{stringOi, stringOi,doubleOi});double res =  javaDoubleObjectInspector.get(computeUnitPrice.evaluate(param));System.out.println("res " + res);}

4.打jar包

将项目打成jar包

mvn clean package

执行完成,target目录下寻找自己的jar包

5.上传服务器

本地上传到机器,再由机器上传到hdfs或者s3等

6.代码中引用

add jars xxxxx/compute_sku_unit_price.jar;
create temporary function compute_sku_unit_price as 'xx.xxx.xxx.xxx.ComputeUnitPrice';
${your_sql};
http://www.lryc.cn/news/215563.html

相关文章:

  • Vue进阶(幺陆肆)Apache的Access.log分析总结
  • Apple 苹果发布 M3、M3 Pro 和 M3 Max 芯片
  • Linux常用命令及主流服务部署大全
  • list-watch集群调度
  • 深度强化学习中的神经网络部分的作用是什么?一般如何选择合适的神经网络呢?
  • 若依系统的数据导入功能设置
  • vue页面父组件与子组件相互调用方法和传递参数值
  • vim使用
  • 人工智能基础_机器学习014_BGD批量梯度下降公式更新_进一步推导_SGD随机梯度下降和MBGD小批量梯度下降公式进一步推导---人工智能工作笔记0054
  • Android STR研究之一
  • 单链表的详解实现
  • 抛弃 scp 改用 rsync,让 Linux 下文件传输高效无比
  • Leetcode 2919. Minimum Increment Operations to Make Array Beautiful
  • 关键词搜索亚马逊商品数据接口(标题|主图|SKU|价格|优惠价|掌柜昵称|店铺链接|店铺所在地)
  • [计算机提升] Windows系统软件:娱乐类
  • 【Git企业开发】第五节.远程操作
  • idea 配置checkstyle全过程
  • 小程序如何设置自动使用物流账号发货
  • 高性能渲染——详解Html Canvas的优势与性能
  • 2023.10 各个编程语言 受欢迎指数 排行
  • 『PyQt5-基本控件』| 15 如何设置主窗口居中?退出应用程序如何操作?
  • scrapy+selenium框架模拟登录
  • 【实验五】题解
  • Android开发知识学习——Kotlin基础
  • C++——定义一个 Book(图书)类
  • 深度学习之基于YoloV5的道路地面缺陷检测系统(UI界面)
  • AcWing94. 递归实现排列型枚举:输出1~n的全排列
  • 神经网络多种注意力机制原理和代码讲解
  • 前端HTML
  • Jenkins安装(Jenkins 2.429)及安装失败解决(Jenkins 2.222.4)