java写hive自定义函数,Hive自定义函数与JDBC连接

本文介绍如何在Hive中自定义函数(UDF)并进行JDBC访问的方法。首先通过实例展示了创建及注册UDF的步骤,包括编写Java代码、打包为jar文件、上传至Hive并测试;接着介绍了通过Java应用程序利用Hive JDBC连接来调用UDF的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自定义函数

编写代码

1.创建一个普通Java工程

2.导入hive安装目录下lib中所有以hive打头的jar包

3.写代码实现一个ToUpper类

package com.jv.hive;

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

public class MyToUpper extends UDF{

public String evaluate(String src) {

return src.toUpperCase();

}

}

4.导入jar包

5.上传jar包到hive安装目录下的lib中

注册函数

1.添加jar

hive> add jar /home/hadoop/proc/apache-hive-1.2.2/lib/mytoupper.jar;

输出:

get-article-detail-2666.html

efc9d011cade739eddf415bd39ef4b70.png

2.注册类

create temporary function mytoupper as 'com.jv.hive.MyToUpper';

输出:

get-article-detail-2666.html

213266c2f09cf3f0dba5d77d686f7b74.png

3.测试

select mytoupper(ename) from emp limit 10;

输出:

get-article-detail-2666.html

55daf6cc006f7315272395ef383bd10a.png

重要:上面注册的UDF函数是临时的,如果退出hive客户端,再进去就无法使用mytoupper函数

Hive提供了永久注册函数的方式:

create function park.mytoupper as 'com.jv.hive.MyToUpper' using jar 'hdfs://192.168.245.150:9000/user/hive/warehouse/udf/mytoupper.jar'

park是数据库名

jar包需要放到hdfs中

所有客户端连接上来都可以使用mytoupper函数

其他数据库要使用该函数可以加park.mytoupper

建议不要弄太复杂的函数,如果效率低下会严重影响hive的性能,甚至把机器搞挂

jdbc访问Hive

1.在服务器上启动hive service

./hive --service hiveserver2 &

2.在上面的工程中加入hadoop-common-2.7.1.jar包

3.编写代码

package com.jv.hive;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.Statement;

public class TestHiveJdbc {

public static void main(String[] args) throws Exception {

Class.forName("org.apache.hive.jdbc.HiveDriver");

Connection conn = DriverManager.getConnection("jdbc:hive2://192.168.245.150:10000/park","root","root");

Statement stat = conn.createStatement();

/*

* 1.如果注册UDF函数是临时的,想要在代码中使用UDF还需重新注册

String sql = "add jar /home/hadoop/proc/apache-hive-1.2.2/lib/mytoupper.jar";

stat.execute(sql);

sql = "create temporary function mytoupper as 'com.jv.hive.MyToUpper'";

stat.execute(sql);

* 2.如果注册UDF函数是永久的,则可以直接使用UDF函数

*/

ResultSet rs = null;

rs = stat.executeQuery("select mytoupper(ename) ename from emp limit 10");

while(rs.next()) {

System.out.println(rs.getString("ename"));

}

stat.close();

conn.close();

}

}

只是为了演示,所以异常处理都是直接throws

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值