Hive IDE连接及UDF实战
# Hive IDE连接 + UDF实战|完整一步通
我给你**最实用、企业真实场景、直接能跑**的全套流程:
**DataGrip/DBeaver连接Hive** + **Java写UDF + 上传 + 注册 + 调用**
---
# 一、Hive IDE 连接(2种最常用工具)
## 1. 连接前提
- 知道 **Hive Server2 地址**(host:10000)
- 账号密码(若开启kerberos则需要keytab)
- 网络通(能访问10000端口)
---
## 2. DBeaver 连接 Hive(免费推荐)
1. 新建连接 → 搜索 **Apache Hive**
2. 配置:
- Host:hive server2 IP
- Port:10000
- Database:default
- 用户名:你的账号(无密码留空)
3. **驱动选择**:Hive 2/3 对应驱动
4. 测试连接 → 成功
---
## 3. DataGrip 连接 Hive(企业最常用)
1. 新建数据源 → **Apache Hive**
2. 填写:
- Host
- Port 10000
- Database default
3. 切换驱动:**Hive 3.x**
4. 高级参数(可选)
```
set hive.execution.engine=tez;
```
5. 测试连接
---
# 二、Hive UDF 实战(企业标准流程)
## 什么是 UDF?
自定义函数,对Hive查询的**每一行数据做处理**
例如:脱敏、加密、截取、清洗、格式转换
---
# 三、实战:写一个【手机号脱敏 UDF】
## 步骤1:创建Maven项目,导入依赖
```xml
<dependencies>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>3.1.2</version>
<scope>provided</scope>
</dependency>
</dependencies>
```
---
## 步骤2:写Java UDF代码
```java
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
public class MaskPhone extends UDF {
public Text evaluate(Text phone) {
if (phone == null || phone.toString().length() != 11) {
return new Text("");
}
String s = phone.toString();
return new Text(s.substring(0, 3) + "****" + s.substring(7));
}
}
```
---
## 步骤3:打包成 JAR
Maven 执行:
```
mvn package
```
得到:`udf-demo.jar`
---
## 步骤4:上传JAR到Hive
### 方式A:临时函数(当前会话有效)
```sql
add jar /path/udf-demo.jar;
create temporary function mask_phone as 'com.xxx.MaskPhone';
```
### 方式B:永久函数(所有会话可用,企业用)
1. 上传JAR到HDFS
```
hdfs dfs -put udf-demo.jar /user/hive/udf/
```
2. 创建永久函数
```sql
create function mask_phone as 'com.xxx.MaskPhone'
using jar 'hdfs:/user/hive/udf/udf-demo.jar';
```
---
## 步骤5:使用 UDF
```sql
select phone, mask_phone(phone) from user_info;
```
输出:
```
13812345678 138****5678
```
---
# 四、企业常用 3 类 UDF 模板
## 1. 字符串脱敏(最常用)
```java
public Text evaluate(Text str) { ... }
```
## 2. 日期格式化
```java
public Text evaluate(Text ts) { ... }
```
## 3. 数据清洗(空值替换)
```java
public Text evaluate(Text s) { ... }
```
---
# 五、常见问题
1. **ClassNotFound**
- JAR路径不对
- 包名写错
2. **Function doesn't exist**
- 未 add jar
- 未创建函数
3. **返回NULL**
- evaluate方法参数类型不匹配(必须用 **Text**)

