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

Hive用户自定义函数之UDF开发

在进行大数据分析或者开发的时候,难免用到Hive进行数据查询分析,Hive内置很多函数,但是会有一部分需求需要自己开发,这个时候就需要自定义函数了,Hive的自定义函数开发非常方便,今天首先讲一下UDF的入门开发。

UDF开发

简单实现将字符串小写化的功能。

环境版本

  • Hive 3.1.0.X
  • JDK 8
  • Maven 3.8.1

开发步骤

首先Maven创建

引入Jar包
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.hive.tutorial</groupId><artifactId>low-str</artifactId><version>1.0.0</version><packaging>jar</packaging><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>3.1.0</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>3.1.0</version></dependency></dependencies>
</project>
编写UDF函数
package com.hive.tutorial.udf;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;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.StringObjectInspector;
import org.apache.hadoop.io.Text;/*** @author panlf* @date 2024/1/3*/
public class LowStr extends GenericUDF {StringObjectInspector stringObjectInspector;@Overridepublic ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {if(arguments == null || arguments.length != 1){throw new UDFArgumentException("该方法只接受一个参数");}ObjectInspector a = arguments[0];if (!(a instanceof StringObjectInspector)) {throw new UDFArgumentException("该方法的参数必须是字符串");}//检查通过后,将参数赋值给成员变量ObjectInspector,为了在evaluate()中使用this.stringObjectInspector = (StringObjectInspector) a;//用工厂类生成用于表示返回值的ObjectInspectorreturn PrimitiveObjectInspectorFactory.javaStringObjectInspector;}@Overridepublic Object evaluate(DeferredObject[] arguments) throws HiveException {String v = stringObjectInspector.getPrimitiveJavaObject(arguments[0].get());return new Text(v.toLowerCase());}@Overridepublic String getDisplayString(String[] children) {return "将输入的字符串小写化";}
}

注意很多网上资料其实是继承UDF这个类的,但是这个类已过时了,建议使用GenericUDF
在这里插入图片描述
GenericUDF和UDF都是Hive中的用户自定义函数,但两者在处理数据类型和灵活性上有所不同。基础的UDF接口适合于简单的数据类型,如文本、整数等,而复杂的GenericUDF则可以处理更复杂的数据类型,包括Map、List和Set。

具体来说,以下是GenericUDF相对于UDF的优势:

  • 处理复杂数据类型:GenericUDF不仅可以处理Hadoop和Hive的基本类型,如Text、IntWritable、LongWritable、DoubleWritable等,还可以处理复杂的数据结构,如Array、Map、Struct等。
  • 灵活性:相比于UDF,GenericUDF提供了更多的灵活性。例如,它可以在函数开始之前和结束之后执行一些初始化和清理操作。此外,GenericUDF允许用户重载evaluate()方法,使其具有更强的功能。

因此,当您需要处理的数据类型比较复杂或需要进行一些特定的初始化和清理操作时,建议使用GenericUDF而不是UDF。

打包
mvn clean package

部署到Hive

Jar上传至服务器

首先将Jar传到服务器,我是传到服务器的/data/temp_data/文件夹下

HDFS将Jar传入到Hadoop

通过HDFS命令将Jar包传到Hadoop上

> hdfs dfs -put /data/temp_data/low-str-1.0.0.jar /hivejar/hiveudf

Hive客户端操作,添加Jar包

运行Hive cli,进入Hive客户端
运行以下命令

 hive > add jar hdfs://172.23.39.9:8020/hivejar/hiveudf/low-str-1.0.0.jar;

在这里插入图片描述

建函数

临时函数
create temporary function low_str as 'com.hive.tutorial.udf.LowStr'; 

然后即可使用

select low_str('AAAA');

在这里插入图片描述
注意

Hive的UDF临时函数在会话结束时失效

永久函数
create function sys.low_str as 'com.hive.tutorial.udf.LowStr' using jar 'hdfs://172.23.39.9:8020/hivejar/hiveudf/low-str-1.0.0.jar';

注意sys.low_str 中的sys代表的是库名,如果没有指定的话,默认是default

销毁函数
drop function low_str;
查看函数
//查看全部函数
show functions;### 查看某个函数
describe function low_str;

Java中使用永久函数

我在Java的程序中调用该永久函数,发生以下错误,就是无法识别出注册的函数。
在这里插入图片描述
我通过查资料发现以下方法可解决(包括且不限于)

  • 调用函数的时候,是否带上了库名(我第一次建立在default下面,我在Hive客户端是不带default就能直接使用函数,所以我以为Java程序中也能直接写,但是测试发现Java程序中需要使用default.low_str
  • 使用RELOAD FUNCTIONS,重刷FUNCTIONS信息
  • 重启Hive
    。。。。

相关文章:

Hive用户自定义函数之UDF开发

在进行大数据分析或者开发的时候&#xff0c;难免用到Hive进行数据查询分析&#xff0c;Hive内置很多函数&#xff0c;但是会有一部分需求需要自己开发&#xff0c;这个时候就需要自定义函数了&#xff0c;Hive的自定义函数开发非常方便&#xff0c;今天首先讲一下UDF的入门开发…...

Unity中URP下的线性雾

文章目录 前言一、线性雾 雾效因子二、MixFog1、ComputeFogIntensity 雾效强度计算2、雾效颜色混合 lerp(fogColor, fragColor, fogIntensity); 前言 在之前的文章中&#xff0c;我们实现了URP下的雾效支持。 Unity中URP下的添加雾效支持 在上一篇文章中,我们解析了 URP 下统…...

SpringBoot全局Controller返回值格式统一处理

一、Controller返回值格式统一 1、WebResult类 在 Controller对外提供服务的时候&#xff0c;我们都需要统一返回值格式。一般定义一个 WebResult类。 统一返回值&#xff08;WebResult类&#xff09;格式如下&#xff1a; {"success": true,"code": 2…...

程序媛的mac修炼手册-- 终端shell的驾驭 zsh vs bash

进入终端(Terminal)为新下载的应用配置环境&#xff0c;是Mac生产力up up的关键一步&#xff0c;更是编程小白装大神的第一步。Fake it till you make it , 硅谷大神标准路径&#xff5e; shell的基本原理 为应用配置环境&#xff0c;相当于在应用和操作系统间架桥。由此&…...

基于PHP的校园代购商城系统

有需要请加文章底部Q哦 可远程调试 基于PHP的校园代购商城系统 一 介绍 此校园代购商城系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。(附带参考设计文档) 技术栈&#xff1a;phpmysqlbootstrapphpstudyvscode 二 功能 …...

感知与认知的碰撞,大模型时代的智能文档处理范式

目录 0 写在前面1 GPT4-V&#xff1a;拓宽文档认知边界2 大语言模型的文档感知缺陷3 大一统文档图像处理范式3.1 像素级OCR任务3.2 OCR大一统模型3.3 长文档理解与应用 4 总结抽奖福利 0 写在前面 由中国图象图形学学会青年工作委员会发起的第十九届中国图象图形学学会青年科学…...

ECMAScript和JavaScript的区别

ECMAScript和JavaScript之间的关系和差异可以从以下几个方面来理解&#xff1a; 定义&#xff1a; ECMAScript&#xff1a;ECMAScript是一种由Ecma国际&#xff08;前身为欧洲计算机制造商协会&#xff0c;英文名称是European Computer Manufacturers Association&#xff09;通…...

[BUG]Datax写入数据到psql报不能序列化特殊字符

1.问题描述 Datax从mongodb写入数据到psql报错如下 org.postgresql.util.PSQLException: ERROR: invalid bytesequence for encoding "UTF8": 0x002.原因分析 此为psql独有的错误&#xff0c;不能对特殊字符’/u0000’,进行序列化&#xff0c;需要将此特殊字符替…...

用数据结构python写大数计算器

下面是一个基于Python的大数计算器的示例代码&#xff1a; class BigNumberCalculator:def __init__(self, num1, num2):self.num1 num1self.num2 num2staticmethoddef add(num1, num2):result carry 0len1, len2 len(num1), len(num2)max_len max(len1, len2)for i in …...

08.哲说建造者模式(Builder Pattern)

“The odds that we’re in ‘base reality’ is one in billions.” —— Elon Musk 这段话出自马斯克在2016年的一次演讲&#xff0c;“人类活在真实世界的几率&#xff0c;可能不到十亿分之一”。此言一出&#xff0c;可谓一石激起千层浪。有人嘲讽马斯克是“语不惊人死不休…...

ubuntu18.04查询实时内存、CPU占用率命令

gnome-system-monitor效果就是下面这样&#xff1a;...

Python计算圆的面积

Python 计算圆的面积 圆的面积公式为 &#xff1a; 公式中 r 为圆的半径。 # 定义一个方法来计算圆的面积 def findArea(r): PI 3.142 return PI * (r*r) # 调用方法 r float( input("请输入圆的半径:") ) print( "圆的面积为 %.3f&qu…...

(Java企业 / 公司项目)Nacos的怎么搭建多环境配置?(含相关面试题)(二)

上一篇讲了一个单体服务中配置&#xff0c;传统的Nacos配置但是在微服务架构当中肯定都是多环境下配置&#xff0c;比如生产环境&#xff0c;dev测试环境等等。 第一种方式模拟开始&#xff1a; 首先展示在生产环境中nacos如何配置&#xff0c;在模块下新建一个配置文件&…...

DolphinScheduler实际应用

前言 最近公司新启动了一个项目&#xff0c;然后领导想用一下新技术&#xff0c;并且为公司提供多个大数据调度解决方案&#xff0c;我呢就根据领导要求调研了下当前的开源调度工具&#xff0c;最终决定采用DolphinScheduler&#xff0c; 因此研究了一下DolphinScheduler &…...

P10 RV1126推流项目——ffmpeg输出参数初始化

前言 从本章开始我们将要学习嵌入式音视频的学习了 &#xff0c;使用的瑞芯微的开发板 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ &#x1f525; 推荐专栏2: 《Linux C应用编程&#xff08;概念类&#xff09;_C…...

正定矩阵在格密码中的应用(知识铺垫)

目录 一. 写在前面 二. 最小值点 三. 二次型结构 四. 正定与非正定讨论 4.1 对参数a的要求 4.2 对参数c的要求 4.3 对参数b的要求 五. 最小值&#xff0c;最大值与奇异值 5.1 正定型&#xff08;positive definite&#xff09; 5.2 负定型&#xff08;negative defin…...

关于使用Selenium获取网页控制台的数据

背景&#xff1a; 需要获取网页的控制台的数据&#xff0c;如下图 在此文章将使用到 Pycharm 和 Selenium4 Pycharm安装 Selenium安装 from selenium import webdriver from selenium.webdriver.common.by import By import time# 创建浏览器对象 browser webdriver.Chro…...

vue2和vue3中的路由使用及传参方式

文章目录 vue2中使用路由Vue3 中使用路由路由传参方式 Vue 2 和 Vue 3 中的路由系统有很多相似之处&#xff0c;但也存在一些重要的区别。下面将分别介绍 Vue 2 和 Vue 3 中的路由使用方式&#xff0c;并了解下它们之间的不同之处。 vue2中使用路由 在 Vue 2 中&#xff0c;通…...

论文管理器

论文管理器 这个论文管理器仍然存在许多漏洞。目前&#xff0c;通过按照一些例行程序操作&#xff0c;它可以正常工作。我将在有时间的时候改进代码&#xff0c;提供详细说明&#xff0c;并添加新功能。当该管理器的代码进行优化后&#xff0c;我会上传到github上。 一个建立…...

postfix配置tls加密

1.编译安装 编译安装openss【卸载原有openssl&#xff0c;然后下载新的安装&#xff0c;因为postfix需要新版本openssl】编译安装postfix,下面这行命令 make -f Makefile.init makefiles CCARGS"-DHAS_MYSQL -I/www/server/mysql/include -DUSE_SASL_AUTH -I/usr/include…...

双模型协作:OpenClaw同时调用GLM-4.7-Flash与Coder模型实战

双模型协作&#xff1a;OpenClaw同时调用GLM-4.7-Flash与Coder模型实战 1. 为什么需要双模型协作&#xff1f; 在我的日常开发工作中&#xff0c;经常遇到这样的场景&#xff1a;需要先理解一个复杂需求&#xff08;比如"帮我写个爬虫抓取知乎热榜并分析关键词"&am…...

【英飞凌】TC3XX单片机型号解码:从命名规则看芯片选型

1. 英飞凌TC3XX单片机命名规则解析 第一次接触英飞凌TC3XX系列单片机时&#xff0c;我完全被那一长串型号搞懵了。TC387TP、TC377T、TC397QP...这些看似随机的字母数字组合&#xff0c;其实隐藏着丰富的芯片信息。经过几个项目的实战&#xff0c;我终于摸清了这套命名规则的规律…...

别再只盯着GPS了!从手机导航到无人机测绘,聊聊SPP、DGPS、RTK、PPP这几种定位技术到底该怎么选?

定位技术实战指南&#xff1a;从厘米级精度到全球覆盖的智能决策 站在一片待测绘的工地上&#xff0c;无人机工程师小王正面临一个关键抉择——该为这批新设备配置哪种定位模块&#xff1f;RTK的厘米级精度令人心动&#xff0c;但架设基准站的成本让他犹豫&#xff1b;PPP技术号…...

CPU工作原理:从二进制加法器到计算系统

CPU工作原理&#xff1a;从二进制加法器到计算系统的演进 1. 计算需求与二进制表示 在数字计算领域&#xff0c;加法是最基础也是最重要的运算之一。让我们从一个简单的数学问题开始&#xff1a;6324 244675 &#xff1f;这个看似简单的加法问题&#xff0c;揭示了计算系统的…...

Comsol异构电池力电热耦合模型:探索电池的多场奥秘

comsol异构电池力电热耦合模型 采用椭圆型电极颗粒模拟锂离子正负极的电极颗粒&#xff0c;还原真实电池的3D介观结构&#xff0c;耦合电化学场-热场-力学场&#xff0c;可模拟电流&#xff0c;浓度&#xff0c;温度&#xff0c;应力等多场结果在电池研究领域&#xff0c;深入理…...

OpenClaw终端整合:QwQ-32B命令行操作增强方案

OpenClaw终端整合&#xff1a;QwQ-32B命令行操作增强方案 1. 为什么需要终端智能助手 作为开发者&#xff0c;我们每天要处理大量命令行操作。从简单的目录跳转、文件操作&#xff0c;到复杂的管道命令组合&#xff0c;再到调试报错信息&#xff0c;这些重复性工作消耗了大量…...

好用还专业!盘点2026年备受推崇的一键生成论文工具

一天写完毕业论文在2026年已不再是天方夜谭。最新实测显示&#xff0c;一键生成论文工具正在颠覆传统写作方式&#xff0c;覆盖选题、文献、写作、降重、排版等核心场景&#xff0c;真正实现高效搞定论文&#xff0c;学生党必备神器。 一、全流程王者&#xff1a;一站式搞定论文…...

AI赋能开发:让快马平台智能解析并生成17.100.c.cm规格的优化代码

最近在做一个需要处理特定规格数据的项目&#xff0c;遇到了一个有趣的开发场景&#xff1a;需要基于"17.100.c.cm"这样的参数组合来构建微服务架构。这个看似简单的字符串其实包含了多维度的技术参数&#xff0c;正好可以借助InsCode(快马)平台的AI辅助开发能力来高…...

Linux Ubuntu 24.04 Server 超简单部署 Fast GPT(新手零踩坑)

前言&#xff1a; Fast GPT 是一款基于大语言模型的知识型平台&#xff0c;支持数据处理、RAG检索、可视化AI工作流编排&#xff0c;能快速搭建专属问答系统&#xff0c;无需复杂开发配置。本文针对 Ubuntu 24.04 Server 系统&#xff0c;用最简洁的步骤完成部署&#xff0c;全…...

XL6008直流升压电路设计与应用指南

基于XL6008的直流升压电路设计指南 1. 项目概述 1.1 应用背景 便携式电子设备对电源系统提出了特殊要求&#xff1a;在保持轻量化的同时&#xff0c;需要提供稳定的工作电压。由于单节锂电池的标称电压为3.7V&#xff08;满电4.2V&#xff09;&#xff0c;而许多电子元件需要…...