|
自定义函数 就和MySQL中为我们提供的函数一样比如 sum count() 等... 如果实现否个查询功能MySQL中没有实现该函数满足不了我们的需求这时就需要使用自定义函数了.
需求:
使用hive 读取文件中的手机号 ,并根据手机号得到属于哪个区域的
1
2
3
4
5
6
7
8
| 1383838338 url1 182 433
1333838338 url9 132 543
1393838338 url8 152 43
1373838338 url7 122 23
1343838338 url6 102 98
1383838338 url5 132 53
1393838338 url3 123 34
1323838338 url4 119 532
|
- 编写java程序继承Hive为我们提供的org.apache.hadoop.hive.ql.exec.UDF类实现evaluate
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| /**
* 继承UDF类,重载其中的evaluate方法
*
* @author
*
*/
public class PhoneToArea extends UDF {
private static HashMap<String, String> areaMap = new HashMap<String, String>();
/**
* 从外部数据字典中加载码表到areaMap中
*/
static {
areaMap.put("132", "shenzhen");
areaMap.put("133", "nanjing");
areaMap.put("134", "beijing");
areaMap.put("137", "guangzhou");
areaMap.put("138", "tieling");
areaMap.put("139", "hd");
}
/**
* 必须用public才能让hive调用到
*
* @param phone
* @return
*/
public String evaluate(String phone) {
String area = areaMap.get(phone.substring(0, 3));
if (area == null)
area = "newyork";
return area;
}
}
|
实现方式一:
2.首先使用bin/hive启动hive客户端
自定义函数调用过程:
添加jar包(在hive命令行里面执行)
1
| hive> add jar /home/hadoop/area.jar;
|
2.创建临时函数(自己编写的处理手机号区域的类路径)
1
| hive> create temporary function getArea as 'org.hive.bigdata.hiveudf.PhoneToArea';
|
3.创建Hive映射文件SQL
1
2
3
| hive > create table t_flow(phone string,url string,dflow float)
> row format delimited
> fields terminated by '\t';
|
4.将文件保存到HDFS上的create table 创建的 t_flow目录下(内连接)
1
2
3
4
5
6
7
8
| 1383838338 url1 182 433
1333838338 url9 132 543
1393838338 url8 152 43
1373838338 url7 122 23
1343838338 url6 102 98
1383838338 url5 132 53
1393838338 url3 123 34
1323838338 url4 119 532
|
5.执行映射文件SQL
1
| select phone,getArea(phone) area ,url,dflow from t_flow;
|
6.输出
1
2
3
4
5
6
7
8
| 1383838338 tieling url 1.0
1333838338 nanjing url 9.0
1393838338 hd url 8152.0
1373838338 guangzhou url 7122.0
1343838338 beijing url 6102.0
1383838338 tieling url 5132.0
1393838338 hd url 3123.0
1323838338 shenzhen url 4119.0
|
实现方式二:
1.在bin下启动hive服务端 启动完后光标会停留在某一行代表启动成功
2.在另一台机器上启动hive的客户端在bin下
3.输入hive客户端需要连接hive服务端的地址
1
| beeline> !connect jdbc:hive2://192.168.0.207:10000
|
连接成功后出变成
1
| jdbc:hive2://192.168.0.207:10000>
|
验证执行:
4.添加jar包(在hive命令行里面执行)
1
| 0: jdbc:hive2://192.168.0.207:10000> add jar /home/hadoop/area.jar;
|
5.创建临时函数
1
| create temporary function getArea as 'org.hive.bigdata.hiveudf.PhoneToArea';
|
6.执行映射文件SQL语句
1
| select phone,getArea(phone) area ,url,dflow from t_flow;
|
7.输出结果
1
2
3
4
5
6
7
8
9
10
11
12
| +-------------+------------+------+---------+
| phone | area | url | dflow |
+-------------+------------+------+---------+
| 1383838338 | tieling | url | 1.0 |
| 1333838338 | nanjing | url | 9.0 |
| 1393838338 | hd | url | 8152.0 |
| 1373838338 | guangzhou | url | 7122.0 |
| 1343838338 | beijing | url | 6102.0 |
| 1383838338 | tieling | url | 5132.0 |
| 1393838338 | hd | url | 3123.0 |
| 1323838338 | shenzhen | url | 4119.0 |
+-------------+------------+------+---------+
|
|
|
|