Hive自定义UDF函数及使用

news2024/11/16 21:25:51

目录

一、UDF概述

二、编写自定义UDF

1.创建项目

2.pom.xml文件添加依赖

3.编写工具类及自定义UDF类

4.打包

5.测试 jar

6.上传至服务器、HDFS并给jar包赋权

7.添加到hive类路径并创建临时函数

8.使用测试:

9.临时函数、永久函数

 


一、UDF概述

        UDF全称:User-Defined Functions,即用户自定义函数,在Hive SQL编译成MapReduce任务时,执行java方法,类似于像MapReduce执行过程中加入一个插件,方便扩展。

二、编写自定义UDF

1.创建项目

        启动IDEA,创建MAVEN项目

 

2.pom.xml文件添加依赖

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

3.编写工具类及自定义UDF类

加密、解密工具类


import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

/**
 * @Author liujian
 * @Date 2023/1/30 10:45
 * @Version 1.0
 */
public class AES {
    public static final String ENCODE_RULES = "8DFC34B0B7C98EFA0A299A6C3FFFBD9D";
    /*
     * 加密
     * 1.构造密钥生成器
     * 2.根据ecnodeRules规则初始化密钥生成器
     * 3.产生密钥
     * 4.创建和初始化密码器
     * 5.内容加密
     * 6.返回字符串
     */
    public static String AESEncode(String encodeRules,String content){
        try {
            //1.构造密钥生成器,指定为AES算法,不区分大小写
            KeyGenerator keygen=KeyGenerator.getInstance("AES");
            //2.根据ecnodeRules规则初始化密钥生成器
            //生成一个128位的随机源,根据传入的字节数组
            SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
            random.setSeed(encodeRules.getBytes());
            keygen.init(128, random);            //3.产生原始对称密钥
            SecretKey original_key=keygen.generateKey();
            //4.获得原始对称密钥的字节数组
            byte [] raw=original_key.getEncoded();
            //5.根据字节数组生成AES密钥
            SecretKey key=new SecretKeySpec(raw, "AES");
            //6.根据指定算法AES自成密码器
            Cipher cipher=Cipher.getInstance("AES");
            //7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密解密(Decrypt_mode)操作,第二个参数为使用的KEY
            cipher.init(Cipher.ENCRYPT_MODE, key);
            //8.获取加密内容的字节数组(这里要设置为utf-8)不然内容中如果有中文和英文混合中文就会解密为乱码
            byte [] byte_encode=content.getBytes(StandardCharsets.UTF_8);
            //9.根据密码器的初始化方式--加密:将数据加密
            byte [] byte_AES=cipher.doFinal(byte_encode);
            //10.将加密后的数据转换为字符串
            //这里用Base64Encoder中会找不到包
            //解决办法:
            //在项目的Build path中先移除JRE System Library,再添加库JRE System Library,重新编译后就一切正常了。
            //11.将字符串返回
            return new BASE64Encoder().encode(byte_AES);
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        }

        //如果有错就返加nulll
        return null;
    }
    /*
     * 解密
     * 解密过程:
     * 1.同加密1-4步
     * 2.将加密后的字符串反纺成byte[]数组
     * 3.将加密内容解密
     */
    public static String AESDncode(String encodeRules,String content){
        try {
            //1.构造密钥生成器,指定为AES算法,不区分大小写
            KeyGenerator keygen=KeyGenerator.getInstance("AES");
            //2.根据ecnodeRules规则初始化密钥生成器
            //生成一个128位的随机源,根据传入的字节数组
            SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
            random.setSeed(encodeRules.getBytes());
            keygen.init(128, random);
            //3.产生原始对称密钥
            SecretKey original_key=keygen.generateKey();
            //4.获得原始对称密钥的字节数组
            byte [] raw=original_key.getEncoded();
            //5.根据字节数组生成AES密钥
            SecretKey key=new SecretKeySpec(raw, "AES");
            //6.根据指定算法AES自成密码器
            Cipher cipher=Cipher.getInstance("AES");
            //7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密(Decrypt_mode)操作,第二个参数为使用的KEY
            cipher.init(Cipher.DECRYPT_MODE, key);
            //8.将加密并编码后的内容解码成字节数组
            byte [] byte_content= new BASE64Decoder().decodeBuffer(content);
            /*
             * 解密
             */
            byte [] byte_decode=cipher.doFinal(byte_content);
            return new String(byte_decode, StandardCharsets.UTF_8);
        } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IOException | IllegalBlockSizeException | BadPaddingException e) {
            e.printStackTrace();
        }

        //如果有错就返加nulll
        return null;
    }

}

UDF类 代码

import com.qiyu.util.AES;
import org.apache.hadoop.hive.ql.exec.UDF;

public class AESUDF extends UDF {
    String password = "8DFC34B0B7C98EFA0A299A6C3FFFBD9D";

    public String evaluate ( String type , String content) throws Exception {
        if (content == null) return null;

        if(! type.equals("encode") && ! type.equals("decode")){
            throw new Exception("Parmeter one is needed encode/decode");
        }

        if( type.equals("encode")){
            //进行加密
            return AES.AESEncode (password, content);
        }else {
            //进行解密
            return AES.AESDncode(password, content);
        }
    }

    public static void main(String[] args) throws Exception {
        AESUDF ase = new AESUDF();
        System.out.println(ase.evaluate("encode","hello world"));
        System.out.println(ase.evaluate("decode","uW6YH6mvckQxBATpfJbMnw=="));
    }

4.打包

       依次点击 IDEA (File --- Projiect Structure ---Artifacts --- + --- jar --- From modules with ...)

                选择 主加载UDF类 

注:将默认路径后面 \main\java 删除,原本路径为:D:\java_project\own_udf\src\main\java\

打包成功后,进入out目录,利用压缩软件 打开 jar 包,修改 jar,删除

 META-INF目录下面 的所有 文件及文件夹 (只保留 maven文件夹 ,MANIFEST.MF文件 )

5.测试 jar

        java -jar D:\java_project\own_udf\out\artifacts\own_udf_jar\own_udf.jar

6.上传至服务器、HDFS并给jar包赋权

7.添加到hive类路径并创建临时函数

hive> add jar hdfs:///UDF_lib/ASEUDF.jar;
Added [/tmp/6ebfbc8b-18e5-4437-87fd-56293e03b159_resources/ASEUDF.jar] to class path
Added resources: [hdfs:///UDF_lib/ASEUDF.jar]
hive> create temporary function ase_udf as "com.jiami.AESUDF";
OK
Time taken: 0.375 seconds
hive> 

8.使用测试

hive> select ase_udf("encode","hello");
OK
pHd9T1SMP8Ii7OmuVvFk/w==
Time taken: 1.68 seconds, Fetched: 1 row(s)
hive> select ase_udf("decode","pHd9T1SMP8Ii7OmuVvFk/w==");
OK
hello
Time taken: 0.115 seconds, Fetched: 1 row(s)
hive> 

9.临时函数、永久函数

//临时函数
create temporary function ase_udf as "com.jiami.AESUDF";


//永久函数
create  function ASE_udf as "com.jiami.AESUDF" using jar "hdfs://hive1:8020/UDF_lib/ASEUDF.jar";


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/186533.html

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

相关文章

面试项目经验相关技巧

前言 面试问项目经验主要是想了解所做项目用到的技术&#xff0c;以及自己在项目中扮演的角色。 一、秒杀系统 秒杀系统往往不是咱的项目经验&#xff0c;但是面试可能会问&#xff0c;在说自己项目经验的时候也可以往秒杀和高并发上面带。 可能遇到的问题 高并发 一般就是…

阿里云KMS创建应用接入点

1.进入KMS控制台https://kms.console.aliyun.com/cn-beijing/applicationAP/list2.应用管理->创建应用接入点应用接入点可以想象成一个入口。入口打开的时候&#xff0c;运行在你服务器中的代码&#xff08;KMS客户端&#xff09;才可以与阿里云的KMS实例通讯。2.1设置入口名…

【软件测试】离开“浪浪山“测试人迎来的春天......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 这几年因为疫情、经…

Activiti7工作环境搭建_创建基础工程自动创建Activiti数据库表---工作流工作笔记004

然后我们开始来搭建activiti的环境 首先给idea安装activiti插件,从插件里搜索 actiBPM注意,这个直接在idea中搜索可能搜索不到,因为太旧了这个工具,新的idea已经不支持,需要手动去actiBpm 官网下载以后手动安装 下载就可以了 下载以后点击齿轮,然后选择从硬盘安装 选择下载好的…

注册公司认缴vs实缴,选择哪一个更好?

前言 上一篇说了在创业的时候先进行选择公司类型&#xff0c;然后在公司注册过程中都需要登记公司的注册资本&#xff0c;会涉及注册资金这一点&#xff0c;而现在有认缴制和实缴制&#xff0c;到底选择哪一个更好呢&#xff1f; 在选择之前&#xff0c;先来和大家分享下认缴制…

PyG-节点分类+链接预测+异常检测示例

引言图神经网络(Graph Neural Networks)是一种针对图结构数据(如社交图、网络安全网络或分子表示)设计的机器学习算法。它在过去几年里发展迅速&#xff0c;被用于许多不同的应用程序。在这篇文章中我们将回顾GNN的基础知识&#xff0c;然后使用Pytorch Geometric解决一些常见的…

idea本地debug调试DATAX插件运行

datax官方github地址&#xff1a;GitHub - alibaba/DataX: DataX是阿里云DataWorks数据集成的开源版本。 接触datax是看重他的数据采集功能和可以扩展插件的功能&#xff0c;根据官方说明&#xff0c;DATAX是以python来调用插件的运行json配置&#xff0c;但对于二次开发插件的…

nacos权限区分

背景 nacos的默认是不进行分配权限的&#xff0c;那么这样就带来了一个问题&#xff0c;如果多项目共同使用一个nacos&#xff0c;可以带了一个情况是开发人员误操作&#xff0c;把其他项目的nacos配置文件更改或者删除。那么如何解决这个问题呢&#xff1f;就是把nacos进行分…

网络知识详解之:网络攻击与安全防护

网络知识详解之&#xff1a;网络攻击与安全防护 计算机网络相关知识体系详解 网络知识详解之&#xff1a;TCP连接原理详解网络知识详解之&#xff1a;HTTP协议基础网络知识详解之&#xff1a;HTTPS通信原理剖析&#xff08;对称、非对称加密、数字签名、数字证书&#xff09;…

Kotlin 1.8.0 现已发布,有那些新特性?

文章目录**如何安装 Kotlin 1.8.0****如果您遇到任何问题****更多文章和视频**结语Kotlin 1.8.0 版本现已发布&#xff0c;以下是其部分最大亮点&#xff1a; JVM 的新实验性功能&#xff1a;递归复制或删除目录内容提升了 kotlin-reflect 性能新的-Xdebug编译器选项&#xff…

PCB铺铜技巧如何铺铜经验总结

&#x1f3e1;《总目录》 目录1&#xff0c; 什么是铺铜2&#xff0c;铺铜的好处3&#xff0c;如何铺铜4&#xff0c;铺铜的经验原则5&#xff0c;铺铜的注意事项1&#xff0c; 什么是铺铜 铺铜是指在PCB电气层添加整块的铜皮&#xff1b;铺铜包括电源层铺铜&#xff0c;地层铺…

openofdm03:Frequency Offset Correction

载波频率偏移&#xff08;Carrier Frequency Offset&#xff0c;CFO&#xff09;&#xff1a;发射机和接收机本振频率之差&#xff0c;会造成接收到的I/Q采样值的相位旋转。This symptom of this offset is a phase rotation of incoming I/Q samples (time domain). The CFO c…

基于语义分割实现人脸图像的皱纹检测定位与分割

前言 人脸皱纹主要区分有额纹、川字纹、眼下纹、法令纹、嘴角纹&#xff0c;眼角纹等&#xff0c;在美颜相机&#xff0c;智能医美等于应用领域里&#xff0c;需要对人脸皱纹进行检测、定位、分割&#xff0c;测量等。 传统图像算法的皱纹检测 1.传统算法的皱纹检测可参考《…

仿京东PC网页商品详情的放大镜效果(原理+代码)

实现效果 黑色只不过是转gif出问题而已 准备工作 1. 访问该网址&#xff0c;理解我们要弄的放大镜效果&#xff0c;鼠标经过商品图片&#xff0c;显示一个黄色的放大选区&#xff0c;右边显示该选区的大图。 2. 获取商品图片和商品大图 【摩托罗拉moto X30 Pro】摩托罗拉mot…

protocol-buffers 基础(一)

protocol-buffers 官网 Github 一、概述 协议缓冲区&#xff08;protocol-buffers&#xff09;是一种与语言无关、与平台无关的可扩展机制&#xff0c;用于序列化结构化数据。 协议缓冲区提供了一种与语言无关、与平台无关、可扩展的机制&#xff0c;用于以向前兼容和向后兼…

【深度学习笔记】全卷积网络FCN及 ROI Pooling 和 ROI Align 的区别

问题 FCN 是语义分割的开山之作,没理由不了解。最近发现学习最快的方式还是看别人的教学视频,很多时候博客看一大推,没几个能讲地明白的,确实啊,视频都得用四五十分钟的东西,一个博客得写得多详细才能覆盖到方方面面呀,以后还是先借助视频来学习,然后再根据源码进一步…

leetcode 1669. 合并两个链表【python3一次遍历方法详细过程描述】

题目 给你两个链表list1和list2&#xff0c;它们包含的元素分别为n个和m个。请你将list1中下标从a到b的全部节点都删除&#xff0c;并将list2接在被删除节点的位置。 下图中蓝色边和节点展示了操作后的结果&#xff1a; 请你返回结果链表的头指针。 示例1&#xff1a; 输入&…

网络原理(TCP/IP五层协议)(二)

目录TCP 中的一些主要机制1.确认应答机制(安全机制)2.超时重传机制(安全机制)3.连接管理机制(安全机制)如何建立连接&#xff1a;三次握手如何断开连接&#xff1a;四次挥手TCP 中的一些主要机制 TCP对数据传输提供的管控机制&#xff0c;主要体现在两个方面&#xff1a;安全和…

C++右值引用相关

能够取地址值、有名字的就是左值&#xff0c;不能取地址值、没名字的就是右值。 移动语义 将内存的所有权从一个对象转换到另一个对象&#xff0c;高效的移动来替换效率低下的赋值。 完美转发 定义一个函数模板&#xff0c;该函数模板可以接受任意类型参数&#xff0c;然后将参…

即时通讯开发之TCP/IP中的IP协议、ARP协议

IP 协议是 TCP/IP 协议的核心,所有的 TCP,UDP,IMCP,IGCP 的数据都以 IP 数据格式传输。要注意的是,IP 不是可靠的协议,这是 说,IP 协议没有提供一种数据未传达以后的处理机制--这被认为是上层协议--TCP 或 UDP 要做的事情。所以这也就出现了 TCP 是一个可靠的协议,而 UDP 就没有…