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.mzph.cn/news/126411.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件工程:小组开发过程技术(VS VSS UNIX C++)

&#xff08;注&#xff1a;这个东西是2007年写的&#xff0c;算是个缅怀&#xff0c;或是个吐槽。所有注都是本次发布新加的。&#xff09; 简介 本文讲述完全没有软件工程经验的软件小组如何借助VS VSS等工具为UNIX开发C程序&#xff0c;实现在小组规模的初级开发过程。这不…

【EI会议征稿】第七届先进算法与控制工程国际学术会议(ICAACE 2024)

第七届先进算法与控制工程国际学术会议&#xff08;ICAACE 2024&#xff09; 2024 7th International Conference on Advanced Algorithms and Control Engineering 第七届先进算法与控制工程国际学术会议&#xff08;ICAACE 2024&#xff09;定于2024年1月26-28日在中国上海…

Android Framework 常见解决方案(24)去除 Android正在启动/Android is Starting 弹窗,直接进入Launcher

1 原理说明 开机以后&#xff0c;设备会有一个“android正在启动”这样的弹框&#xff0c;这个界面是一个叫FallbackHome的Activity来展示的。FallbackHome机制是Android系统启动过程中的一种降级处理机制。当系统启动时&#xff0c;如果默认的Launcher应用无法正常加载或出现…

HD.047 | 水文数据——全球植被数据集[V: VCI]

写在前面 植被作为影响联系土壤、大气、水分等地气要素的重要因素,其准确估算不仅对研究植被动态变化、植被物候过程具有重要意义,而且对于流域生态水文等方面具有十分重要的应用价值。目前已有大量全球植被数据产品,本期选取植被条件指数Vegetation Condition Index(VCI)…

这三种方法轻松实现Excel文档名翻译

在电脑使用中&#xff0c;我们常常需要批量修改文件名并翻译。这时候&#xff0c;我们可以使用“固乔文件管家”软件来轻松实现这一需求。下面就介绍三种方法&#xff0c;帮助你轻松实现Excel文档名翻译。 方法一&#xff1a;使用“固乔文件管家”软件批量修改文件名 1.安装并打…

云原生安全日志审计

记得添加&#xff0c;把配置文件挂载进去 - mountPath: /etc/kubernetes/auditname: audit-policyreadOnly: true.....- hostPath:path: /etc/kubernetes/audit/type: DirectoryOrCreatename: audit-policy/etc/kubernetes/manifests/kube-apiserver.yaml 具体配置文件如下 a…

Paper reading: segment anything in high quality NIPS2023

最近发展起来的SAM模型&#xff0c;表示分割模型的一个大的跃进&#xff0c;尤其是在零样本的能力和灵活提升方面。尽管利用1.1bollion的mask&#xff0c;SAM在掩码预测方面已经存在很大的问题&#xff0c;尤其是目标有着复杂结构的时候。 我们提出一个HA-SAM。 设计学习一个…

C# 如何使用 System.Text.Json 启用不区分大小写的属性名称

本文将介绍如何使用 System.Text.Json 命名空间启用不区分大小写的属性名称匹配。 不区分大小写的属性匹配 默认情况下&#xff0c;反序列化会查找 JSON 与目标对象属性之间区分大小写的属性名称匹配。 若要更改该行为&#xff0c;请将 JsonSerializerOptions.PropertyNameCa…

MySQL 基础学习笔记(二)

目录 1 约束1.1 约束概述1.2 非空约束1.3 唯一约束1.4 主键约束1.5 默认约束1.6 外键约束 2 数据库设计2.1 数据库设计概述2.2 表关系 3 多表查询3.1 多表查询概述3.2 内连接查询3.3 外连接查询3.4 子查询 4 事务4.1 事务概述4.2 四大特征 1 约束 1.1 约束概述 约束是作用于表…

【算法|滑动窗口No.4】leetcode 485.最大连续 1 的个数 487.最大连续 1 的个数 II 1004. 最大连续1的个数 III

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

Feign的Retryer接口

Feign的Retryer接口 Feign的Retryer接口是用于重试失败请求的接口。当使用Feign进行远程调用时&#xff0c;可能会出现网络故障或服务器错误等问题导致请求失败。此时&#xff0c;可以通过Retryer接口实现自动重试机制&#xff0c;让请求重新发送&#xff0c;直到成功或达到最…

@Autowired和@Inject注解的区别和使用场景

在Spring框架中&#xff0c;Autowired和Inject注解都是用于依赖注入的常用注解。然而&#xff0c;它们在用法和功能上存在一些区别。本文将详细介绍这两个注解的区别和使用场景&#xff0c;并通过示例代码进行演示。 一、Autowired和Inject的区别 注解来源 Autowired是Sprin…

股票价格预测 | 融合CNN和Transformer以提升股票趋势预测准确度

一 本文摘要 股票价格往往很难预测,因为我们很难准确建模数据点之间的短期和长期时间关系。卷积神经网络(CNN)擅长找出用于建模短期关系的局部模式。然而,由于其有限的观察范围,CNN无法捕捉到长期关系。相比之下,Transformer可以学习全局上下文和长期关系。本文提出了一…

arcgis图上添加发光效果!

看完本文, 你可以不借助外部图片素材, 让你的图纸符号表达出你想要的光! 我们以之前的某个项目图纸为例,来介绍下让符号发光的技术! 第一步—底图整理 准备好栅格影像底图、行政边界的矢量数据,确保“数据合适、位置正确、边界吻合”。 确定好图纸的大小、出图比例、投…

《TCP/IP详解 卷一:协议》第5章的IPv4数据报的IHL字段解释

首先说明一下&#xff0c;这里并不解释整个IPv4数据报各个字段的含义&#xff0c;仅仅针对IHL字段作解释。 我们先看下IPv4数据报格式 对于IHL字段&#xff0c; 《TCP/IP详解 卷一&#xff1a;协议》这么解释&#xff1a; IPv4数据报。头部大小可变&#xff0c;4位的IHL字段…

怎么让小程序排名靠前?小程序搜索排名问题

小程序的排名是十分重要的&#xff0c;因为这会直接影响到用户的点击率&#xff0c;用户在搜索小程序时&#xff0c;会看到搜索引擎的前几条搜索结果&#xff0c;如果您的小程序不在这些位置上&#xff0c;很可能就会被忽略&#xff0c;所以&#xff0c;想要让用户能够看到您的…

工具类(系统名称架构)

import java.util.Locale;/*** 系统名称架构工具类* 可直接引用使用* 例如&#xff1a;* String name OSUtils.OPERATING_SYSTEM_NAME.name()* String arch OSUtils.OPERATING_SYSTEM_ARCH*/ public class OSUtils {/*** 系统名称*/private final static PlatformEnum OPERAT…

JAVA同城货运搬家系统的运营方案

随着社会经济的发展和人民生活水平的提高&#xff0c;同城货运搬家市场日益繁荣。为了满足消费者对搬家服务的高效、便捷和安全的需求&#xff0c;本文将介绍一种基于JAVA编程语言的同城货运搬家系统&#xff0c;并阐述其运营方案。 一、市场分析 同城货运搬家市场具有广阔的…

1.Python3-介绍

题记 python3介绍 查看python版本 python -V 或 python --version 进入交互式编程模式 在控制台输入&#xff1a; python Hello World 输出Hello World&#xff1a; print("Hello, World!")执行脚本文件 python3 文件名.py 后记 觉得有用可以点赞或收藏&#xf…

springboot苍穹外卖实战:六、redis(Spring Data Redis)

Spring Data Redis 简介 网址&#xff1a;https://spring.io/projects/spring-data-redis Spring Data Redis中提供了一个高度封装的类&#xff1a;RedisTemplate&#xff0c;对相关api进行了归类封装,将同一类型操作封装为operation接口&#xff0c;具体分类如下&#xff1…