Hive UDF自定义函数编写小例子

感谢段海涛老师~

先写一个java类,定义函数逻辑(静态代码块模拟字典)

package club.drguo.hive;

import java.util.HashMap;

import org.apache.hadoop.hive.ql.exec.UDF;
//club.drguo.hive.PhoneNumToArea
public class PhoneNumToArea extends UDF{
	private static HashMap<String, String> areaMap = new HashMap<>();
	static{
		areaMap.put("136", "北京");
		areaMap.put("137", "南京");
		areaMap.put("138", "东京");
	}
	//方法要用public修饰!!!
	public String evaluate(String phoneNum) {
		String result = areaMap.get(phoneNum.substring(0,3))==null?(phoneNum+"---未知"):(phoneNum+"---"+areaMap.get(phoneNum.substring(0,3)));
		return result;
	}
}

导出jar包

启动hive,进入你的数据库,加入jar包

hive> add jar /home/guo/hiveArea.jar;
Added /home/guo/hiveArea.jar to class path
Added resource: /home/guo/hiveArea.jar
创建函数

hive> create temporary function getarea as 'club.drguo.hive.PhoneNumToArea';#''里是包名+类名
OK
Time taken: 5.581 seconds
创建表
hive> create table flow(phoneNum string, upflow int, downflow int)
    > row format delimited fields terminated by '\t';
OK
导入数据

hive> load data local inpath '/home/guo/hivedata/flow.data' into table flow;
Copying data from file:/home/guo/hivedata/flow.data
Copying file: file:/home/guo/hivedata/flow.data
Loading data to table guo.flow
Table guo.flow stats: [num_partitions: 0, num_files: 1, num_rows: 0, total_size: 80, raw_data_size: 0]
OK
使用自定义函数执行查询
hive> select getarea(phoneNum),upflow,downflow from flow;
Total MapReduce jobs = 1
Launching Job 1 out of 1
Number of reduce tasks is set to 0 since there's no reduce operator
Starting Job = job_1458987137545_0002, Tracking URL = http://drguo1:8088/proxy/application_1458987137545_0002/
Kill Command = /opt/Hadoop/hadoop-2.7.2/bin/hadoop job  -kill job_1458987137545_0002
Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 0
2016-03-26 21:50:40,260 Stage-1 map = 0%,  reduce = 0%
2016-03-26 21:51:13,964 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 4.05 sec
2016-03-26 21:51:15,043 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 4.05 sec
2016-03-26 21:51:16,113 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 4.05 sec
2016-03-26 21:51:17,179 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 4.05 sec
MapReduce Total cumulative CPU time: 4 seconds 50 msec
Ended Job = job_1458987137545_0002
MapReduce Jobs Launched: 
Job 0: Map: 1   Cumulative CPU: 4.05 sec   HDFS Read: 286 HDFS Write: 116 SUCCESS
Total MapReduce CPU Time Spent: 4 seconds 50 msec
OK
13666666666---北京	200	300
13777777777---南京	180	700
13888888888---东京	219	923
13999999999---未知	213	823
Time taken: 113.373 seconds, Fetched: 4 row(s)





Hive中,可以通过自定义函数来满足特定需求。下面是一个演示如何在Hive自定义函数例子: 1. 首先,创建一个Java类来实现自定义函数的逻辑。例如,创建一个名为`MaxValueUDF`的类,该类用于计算给定列的最大值。 ```java package com.hive; import org.apache.hadoop.hive.ql.exec.UDF; import org.apache.hadoop.io.Text; public class MaxValueUDF extends UDF { public Text evaluate(Text input) { // 将输入字符串转换为数组 String[] values = input.toString().split(","); // 初始化最大值为第一个元素 int max = Integer.parseInt(values[0]); // 遍历数组,找到最大值 for (int i = 1; i < values.length; i++) { int currentValue = Integer.parseInt(values[i]); if (currentValue > max) { max = currentValue; } } // 返回最大值 return new Text(String.valueOf(max)); } } ``` 2. 编译Java类并将其打包成JAR文件。 3. 在Hive中创建一个临时函数,将JAR文件添加到Hive的classpath中,并指定自定义函数的名称和类。 ```shell ADD JAR /path/to/your/jarfile.jar; CREATE TEMPORARY FUNCTION get_max AS 'com.hive.MaxValueUDF'; ``` 4. 使用自定义函数来计算最大值。例如,假设有一个名为`numbers`的表,其中包含一个名为`value`的列,我们可以使用自定义函数来计算该列的最大值。 ```shell SELECT get_max(value) FROM numbers; ``` 以上是在Hive自定义函数的一个示例。你可以根据自己的需求编写不同的自定义函数来扩展Hive的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光于前裕于后

您的打赏将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值