Java操作Hive系列1-Hive UDF

一.创建Hive工程

1.1 新建Java工程

我们这里为了简单就不用Maven了,而是直接使用lib包并把我们需要的jar包放到lib当中。如下所示。
(lib这个目录是手工创建的)


image.png

1.2 将Hive的lib下所有jar包放到lib目录下

下载地址:https://downloads.apache.org/hive/hive-2.3.9/
备注:需要选择对应的版本

image.png

我们需要把hive的lib下的所有的包放到lib下,hive的jar包所在的位置如下图所示:
截图未截全

image.png

1.3 导入hadoop-common jar包

下载地址:https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-common/3.0.3/
备注:需要选择对应的版本

image.png

1.4 将jar包添加到工程

我们把jar拷到hive-udf工程下的lib包后记得选中所有的jar包,然后右键在菜单中把鼠标放到"Build path"上,这时会出现子菜单,然后点击"Add to Build path"添加到工程当中。

image.png
image.png

二.编写java代码并打包

代码:

package myUdf;

import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;

/**
 * @author  只是甲
 * @date    2021-07-26
 * @remark
 */

public class getDegree extends UDF {
    public String evaluate(int degreetype) {
        /* 1  -- 小学
        2  -- 初中
        3  -- 职业高中
        4  -- 中专
        5  -- 高中
        6  -- 大专
        7  -- 本科
        8  -- 硕士
        9 -- 博士
        */
        String result;
        
        if (degreetype == 1) {
            result = "小学";
        } else if  (degreetype == 2) {
            result = "初中";
        } else if  (degreetype == 3) {
            result = "职业高中";
        } else if  (degreetype == 4) {
            result = "中专";
        } else if  (degreetype == 5) {
            result = "高中";
        } else if  (degreetype == 6) {
            result = "大专";
        } else if  (degreetype == 7) {
            result = "本科";
        } else if  (degreetype == 8) {
            result = "硕士";
        } else if  (degreetype == 9) {
            result = "博士";
        } else {
            result = "N/A";
        }
        
        return result;
    }

}

工程概要如下:

image.png

导出jar包:
选中Project HiveUDF,右键,然后选中Export

image.png

image.png

三. 注册UDF

3.1 上传上一步的jar文件到服务器

image.png

3.2 注册UDF

接着我们需要注册UDF,通知hive我现在注册了一个UDF,要调用这个UDF。注册UDF需要在hive视图下进行,因此我们首先启动hive的bin目录下启动hive。

代码:

-- 添加jar包
add jar /home/java/getDegree.jar;
-- 查看现有的jar包
list jars;
-- 创建临时函数
create temporary function GetDegree as 'myUdf.getDegree';

测试记录:

hive> add jar /home/java/getDegree.jar;
Added [/home/java/getDegree.jar] to class path
Added resources: [/home/java/getDegree.jar]
hive> drop function GetDegree;
hive> 
    > 
    > list jars;
/home/java/getDegree.jar
hive> create temporary function GetDegree as 'myUdf.getDegree';
OK
Time taken: 0.023 seconds
hive> 

3.3 Hive UDF测试

数据准备:

degree_type
1  -- 小学
2  -- 初中
3  -- 职业高中
4  -- 中专
5  -- 高中
6  -- 大专
7  -- 本科
8  -- 硕士
9 -- 博士


create table user_info(id int,degree_type int);
insert into user_info values (1,3);
insert into user_info values (2,1);
insert into user_info values (3,6);
insert into user_info values (4,4);
insert into user_info values (5,5);
insert into user_info values (6,9);
insert into user_info values (7,8);
insert into user_info values (8,2);
insert into user_info values (9,7);


hive> 
    > select * from user_info;
OK
user_info.id    user_info.degree_type
1       3
2       1
3       6
4       4
5       5
6       9
7       8
8       2
9       7
Time taken: 0.088 seconds, Fetched: 9 row(s)

测试Hive UDF:

hive> 
    > 
    > select id,GetDegree(degree_type) from user_info order by id;
Query ID = root_20210726144704_e3235df0-fa86-4eec-8fcd-b5a5e87234cf
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks determined at compile time: 1
In order to change the average load for a reducer (in bytes):
  set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
  set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
  set mapreduce.job.reduces=<number>
21/07/26 14:47:04 INFO client.ConfiguredRMFailoverProxyProvider: Failing over to rm69
Starting Job = job_1627269473896_0006, Tracking URL = http://hp3:8088/proxy/application_1627269473896_0006/
Kill Command = /opt/cloudera/parcels/CDH-6.3.1-1.cdh6.3.1.p0.1470567/lib/hadoop/bin/hadoop job  -kill job_1627269473896_0006
Hadoop job information for Stage-1: number of mappers: 2; number of reducers: 1
2021-07-26 14:47:10,383 Stage-1 map = 0%,  reduce = 0%
2021-07-26 14:47:16,584 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 5.19 sec
2021-07-26 14:47:22,759 Stage-1 map = 100%,  reduce = 100%, Cumulative CPU 6.9 sec
MapReduce Total cumulative CPU time: 6 seconds 900 msec
Ended Job = job_1627269473896_0006
MapReduce Jobs Launched: 
Stage-Stage-1: Map: 2  Reduce: 1   Cumulative CPU: 6.9 sec   HDFS Read: 12073 HDFS Write: 342 HDFS EC Read: 0 SUCCESS
Total MapReduce CPU Time Spent: 6 seconds 900 msec
OK
1       职业高中
2       小学
3       大专
4       中专
5       高中
6       博士
7       硕士
8       初中
9       本科
Time taken: 20.596 seconds, Fetched: 9 row(s)
hive> 

3.4 创建永久性的函数

上面一个步骤我们创建的是临时的函数,退出当前session后,该函数不可用。

[root@hp1 java]# hive
WARNING: Use "yarn jar" to launch YARN applications.
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/cloudera/parcels/CDH-6.3.1-1.cdh6.3.1.p0.1470567/jars/log4j-slf4j-impl-2.8.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/cloudera/parcels/CDH-6.3.1-1.cdh6.3.1.p0.1470567/jars/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]

Logging initialized using configuration in jar:file:/opt/cloudera/parcels/CDH-6.3.1-1.cdh6.3.1.p0.1470567/jars/hive-common-2.1.1-cdh6.3.1.jar!/hive-log4j2.properties Async: false

WARNING: Hive CLI is deprecated and migration to Beeline is recommended.
hive> 
    > use test;
OK
Time taken: 1.154 seconds
hive> 
    > select id,GetDegree(degree_type) from user_info order by id;
FAILED: SemanticException [Error 10011]: Invalid function GetDegree

此时我们可以来创建永久性的函数

-- OS端操作
sudo -u hdfs  hadoop  fs -mkdir /user/hive/lib
sudo -u hdfs  hadoop fs -put /home/java/getDegree.jar /user/hive/lib

-- Hive命令行操作
CREATE FUNCTION GetDegree AS 'myUdf.getDegree' USING JAR 'hdfs:///user/hive/lib/getDegree.jar';

select id,GetDegree(degree_type) from user_info order by id;

测试记录:

[root@hp1 ~]# sudo -u hdfs  hadoop  fs -mkdir /user/hive/lib
[root@hp1 ~]# 
[root@hp1 ~]# 
[root@hp1 ~]# sudo -u hdfs  hadoop fs -put /home/java/getDegree.jar /user/hive/lib

hive> 
    > 
    > CREATE FUNCTION GetDegree AS 'myUdf.getDegree' USING JAR 'hdfs://hp1:9866/user/hive/lib/getDegree.jar';
End of File Exception between local host is: "hp1/10.31.1.123"; destination host is: "hp1":9866; : java.io.EOFException; For more details see:  http://wiki.apache.org/hadoop/EOFException
Failed to register test.getdegree using class myUdf.getDegree
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.FunctionTask
hive> 
    > CREATE FUNCTION GetDegree AS 'myUdf.getDegree' USING JAR 'hdfs:///user/hive/lib/getDegree.jar';
Added [/tmp/4e1c389c-4053-4197-9364-93a01840309c_resources/getDegree.jar] to class path
Added resources: [hdfs:///user/hive/lib/getDegree.jar]
OK
Time taken: 0.203 seconds
hive> select id,GetDegree(degree_type) from user_info order by id;
Query ID = root_20210726152617_b3da9372-0724-4126-8d62-f58fa55afc42
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks determined at compile time: 1
In order to change the average load for a reducer (in bytes):
  set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
  set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
  set mapreduce.job.reduces=<number>
21/07/26 15:26:18 INFO client.ConfiguredRMFailoverProxyProvider: Failing over to rm69
Starting Job = job_1627269473896_0007, Tracking URL = http://hp3:8088/proxy/application_1627269473896_0007/
Kill Command = /opt/cloudera/parcels/CDH-6.3.1-1.cdh6.3.1.p0.1470567/lib/hadoop/bin/hadoop job  -kill job_1627269473896_0007
Hadoop job information for Stage-1: number of mappers: 2; number of reducers: 1
2021-07-26 15:26:26,852 Stage-1 map = 0%,  reduce = 0%
2021-07-26 15:26:33,129 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 2.6 sec
2021-07-26 15:26:38,290 Stage-1 map = 100%,  reduce = 100%, Cumulative CPU 7.12 sec
MapReduce Total cumulative CPU time: 7 seconds 120 msec
Ended Job = job_1627269473896_0007
MapReduce Jobs Launched: 
Stage-Stage-1: Map: 2  Reduce: 1   Cumulative CPU: 7.12 sec   HDFS Read: 11873 HDFS Write: 342 HDFS EC Read: 0 SUCCESS
Total MapReduce CPU Time Spent: 7 seconds 120 msec
OK
1       职业高中
2       小学
3       大专
4       中专
5       高中
6       博士
7       硕士
8       初中
9       本科
Time taken: 22.51 seconds, Fetched: 9 row(s)
hive> 

参考:

  1. https://cwiki.apache.org/confluence/display/Hive/HivePlugins
  2. https://blog.csdn.net/u012453843/article/details/53058193
  3. https://www.cnblogs.com/xuziyu/p/10754592.html
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容

  • 最近遇到一个问题,上一次没有解决,㝼时间关系没有研究,这次逮着机会了,就回了几个小时研究了一下,现把这个过程整理出...
    帅可儿妞阅读 1,043评论 2 0
  • 1、系统内置函数1.查看系统自带的函数hive> show functions;2.显示自带的函数的用法hive>...
    我还不够强阅读 831评论 0 0
  • Hive高级操作 1.使用LIKE、AS创建表,表重命名,添加、修改、删除列 表结构数据复制 根据已存在的表结构,...
    三万_chenbing阅读 1,109评论 0 2
  • 该篇主要是为了整理常用的function使用和开发自定义function的,hive虽说语法类似于mysql,但是...
    刘子栋阅读 5,115评论 0 0
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 124,893评论 2 7