Hive自定义函数

 

 

本文章主要分享单行函数UDF(一进一出)

现在前面大体总结,后边文章详细介绍

自定义函数分为临时函数与永久函数

需要创建Java项目,导入hive依赖

创建类继承 GenericUDF(自定义函数的抽象类)(实现函数)

打成jar包,传到服务器上

将jar包添加到hive的class path上临时生效

通过hive创建函数与Java类建立连接

目录

hive底层运行:

编码:

(一) 创建Java-maven项目:

 (1)导入hive的maven依赖:

(2)创建Java类:

(3)实现Java类中的方法:

1.initialize

2.evaluate方法(要实现函数的核心逻辑)

构造hive函数:

(一)临时函数:

(二)创建永久函数

hive底层运行:

sql语句---》抽象语法树---》形成逻辑执行计划---》翻译成物理执行计划(可以是mapreduce   /  spark )

编码:

(一) 创建Java-maven项目:

 (1)导入hive的maven依赖:

<groupId>org.example</groupId><artifactId>hive-UDTF</artifactId><version>1.0-SNAPSHOT</version>

(2)创建Java类:

创建的Java类是继承自GenericUDF类(抽象类)

继承之后会实现3个函数(initialize,evaluate,getDisplayString)

(3)实现Java类中的方法:

1.initialize

这是一个初始化方法,在该函数的调用之前必须要调用一次

一般进行数据检验

    public ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException {

传入参数为:ObjectInspector[] objectInspectors

ObjectInspector[] 是一个存储源信息的ObjectInspector

处理后返回一个ObjectInspector 给下一个ObjectInspector[]进行处理

//1先取上一步的源信息// 先判断参数的个数if(objectInspectors.length!=1){throw new UDFArgumentLengthException("请输入1个参数");}ObjectInspector objectInspector=objectInspectors[0];
// 判断参数是否是基本数据类型if (objectInspectors[0].getCategory()!=ObjectInspector.Category.PRIMITIVE){throw new UDFArgumentLengthException("请输入一个基本数据类型");}//  假设是string类型(基础数据类型在)   强制类型转化进行判断//非指定类型就进行抛异常PrimitiveObjectInspector primitiveObjectInspector = (PrimitiveObjectInspector) objectInspector;if (primitiveObjectInspector.getPrimitiveCategory()!=PrimitiveObjectInspector.PrimitiveCategory.STRING){throw new UDFArgumentException("只接受string类型");}//返回的时候  需要找到基本数据类型的工厂   让后getInt类型return PrimitiveObjectInspectorFactory.javaIntObjectInspector;}

2.evaluate方法(要实现函数的核心逻辑)

每行数据调用一次

    public Object evaluate(DeferredObject[] deferredObjects) throws HiveException {

传入参数:DeferredObject[] deferredObjects

DeferredObject[]是一个懒加载的值(根据数组下标获取的值不是真值)需要get一下获得真值

 //DeferredObject[] deferredObjects、//获取的是每行数据中的指定列的参数(不用进行校验(init已完成校验否则不会调用此函数))//DeferredObject[]是一个懒加载的值  需要get一下获得真值DeferredObject arg=deferredObjects[0];Object o = arg.get();
//   o可能是空值nullif(o==null){return 0;}return o.toString().length();

构造hive函数:

(一)临时函数:

将Java编码成功后的代码进行打包(package)

打包后上传服务器

将jar包添加到hive的classpath,临时生效(临时函数)

add jar /opt/module/hive/datas/myudf.jar;

创建临时函数并于Java class相联:

create temporary function my_len 
as "com.atguigu.hive.udf.MyUDF";

注意:临时函数只跟会话有关系,跟库没有关系。只要创建临时函数的会话不断,在当前会话下,任意一个库都可以使用其他会话全都不能使用。

(二)创建永久函数:

创建永久函数前需要先将jar包上传到hdfs中,在hive语句中using该路径

create function my_len2 
as "com.atguigu.hive.udf.MyUDF" 
using jar "hdfs://hadoop102:8020/udf/myudf.jar";

函数的使用:

select my_len2("sdsrf");

 

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

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

相关文章

如何通过Pytest的插件,轻松切换自动化测试的环境地址?

前言 前面小编介绍了如何通过Pytest的插件来实现自动化测试的环境的切换&#xff0c;当时使用的方法是通过钩子函数进行获取命令行参数值&#xff0c;然后通过提前配置好的参数进行切换测试环境地址。 今天小编再次介绍一种方法&#xff0c;通过Pytest的插件&#xff1a;pyte…

谷歌Bard更新中文支持;GPT-4:1.8万亿参数、混合专家模型揭秘; Meta推出商用版本AI模型

&#x1f989; AI新闻 &#x1f680; 谷歌的AI聊天工具Bard更新&#xff0c;增加中文支持 摘要&#xff1a;谷歌的AI聊天工具Bard新增中文环境&#xff0c;用户可以使用简体和繁体中文进行交流。然而&#xff0c;与竞品相比&#xff0c;Bard的回复略显生硬&#xff0c;语义理…

Redis深入——管道、发布订阅、主从复制、哨兵监控和集群

前言 在前面的学习中&#xff0c;我们已经了解了Redis的基本语法以及Redis持久化和事务的概念。而在这篇文章中我们继续来梳理管道、发布订阅、主从复制、哨兵监控和集群的知识&#xff0c;理解Redis主从复制到集群分片的演进过程&#xff0c;希望对正在学习的小伙伴有一定的帮…

关于学习过程中的小点

nfev : 函数求值次数njev : Jacobian 评估的数量nit :算法的迭代次数 permute(dims)#维度转换 torch.split #[按块大小拆分张量] Pytorch.view Pytorch中使用view()函数对张量进行重构维度&#xff0c;类似于resize()、reshape()。用法如下&#xff1a;view(参数a,参数b,...)&a…

Boojum:zkSync的高性能去中心化STARK证明系统

1. 引言 2023年7月17日zkSync官方twitter Say hello to Boojum宣称在不regenesis的情况下&#xff0c;将zkSync Era迁移至Boojum证明系统。 Boojum为STARK证明系统&#xff08;PlonkFRI&#xff09;&#xff0c;开源代码见&#xff1a; https://github.com/matter-labs/era-…

Python爬虫学习笔记(三)————urllib

目录 1.使用urllib来获取百度首页的源码 2.下载网页图片视频 3.总结-1 4.请求对象的定制&#xff08;解决第一种反爬&#xff09; 5.编解码 &#xff08;1&#xff09;get请求方式&#xff1a;urllib.parse.quote&#xff08;&#xff09; &#xff08;2&#xff09;get请求…

微信小程序用户登录及头像昵称设置教程(前后端)

目录 1.背景分析 2.具体需求分析 3.前端设计 3.1 用户登录 3.2 头像昵称填写&#xff08;个人信息界面&#xff09; 4.后端设计 4.1项目架构分析 4.2 代码分析 实体类 dao层 service层 controller层 工具类 5.nginx部署 6.效果演示 1.背景分析 众所周知&#x…

拒绝无效内卷|*CTF 2023邀你一起hack for fun!

注意 ⚠️ 2023年07月29日 *CTF 2023携重磅赛题惊喜来袭 请求加入你的假期计划&#xff01; 7月29日09:00-30日09:00 CTF 2023 再度回归 由复旦大学*****战队倾力打造 赛题一如既往质量与趣味并存 知识量与时效性双高 结合时下最新安全漏洞 专注底层逻辑思考 注重知识点本身 …

四阶龙格-库塔方法matlab程序与误差对比

四阶龙格-库塔方法matlab程序与误差对比 简介参考code四阶龙格-库塔函数微分方程函数主程序 结果分析 简介 本例子函数参考了【1】中的函数&#xff0c;增加了解析方法的函数与四阶龙格-库塔方法对比&#xff0c;并计算了百分比误差&#xff0c;最大误差在0.3%左右。 参考 【…

Codeforces Round 884 (Div. 1 + Div. 2)(视频讲解A--D)

[TOC](Codeforces Round 884 (Div. 1 Div. 2)&#xff08;视频讲解A–D&#xff09;) 视频链接&#xff1a;Codeforces Round 884 (Div. 1 Div. 2)&#xff08;视频讲解A–D&#xff09; A Subtraction Game 1、 板书&#xff1a; 2、代码 #include<bits/stdc.h> #…

奇奇怪怪的知识点-EXCEL(1)

如何用Excel提取想要的数据 参考链接&#xff1a;Excel表格中如何在一串数字中提取几位数字 在日常工作中经常会用到EXCEL表格来进行数据的提取和处理&#xff0c;有时候很长一串数据我们只需要提取指定位数后面的数字&#xff0c;EXCEL中内置了很多丰富的函数可以帮助我们高…

【复盘】记录一次类型不一致导致的Kafka消费异常问题

背景 业务主要是通过A系统向B系统写入Kafka&#xff0c;然后B系统消费Kafka 将结果写到Kafka中&#xff0c;A进行消费最终结果。 在整个流程中&#xff0c;A写入Kafka会写入一张 record1表记录&#xff0c;然后在A消费最终结果的时候也记录一张record2表。主要改动的话 只是B系…