0 hive udf作用都限于对字段进行简单处理,
udf定义好后被应用一般有三种方式:
a) hiverc文件中
b) hql文件中写加载
c) hive/scrpits/ 根据文件名从小到大顺序来优先加载文件夹下的文件
据说这是工作中经常用到的 但是这是我工作中基本没用到过的。
1 模拟oracl函数 instr(xiangmu, '已注册(') 的效果
2 java代码:
package hiveudf; import org.apache.hadoop.hive.ql.exec.UDF; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; public class instrfun extends UDF{ // public IntWritable evaluate(Text source, Text part) { String sourceStr = source.toString(); String partStr = part.toString(); int indexPart = sourceStr.indexOf(partStr); // java出现次数以0为基础 indexPart++; return new IntWritable(indexPart); } }
3 将这个javabean打包 为hive-udf.jar ,上次到Linux服务器上
或者可以放在 hive/lib下 这样看着更正式点,这样的话 第4步add jar就需要修改成 hive/lib的路径
4 hive表注册和使用此函数: 在hive命令行下,执行如下语句
add jar /home/new_load_data/lib/hive-udf.jar; create temporary function instrfun as 'hiveudf.instrfun';
5 hive环境中使用写法:
select instrfun(xiangmu,'已注册(') from f_trademark_tmp_hdfs_ext_20150717 limit 4;
参考链接:
http://blog.csdn.net/zythy/article/details/18818559
对应工程jar请看附件
加载说明:
如果你是在修改了 .hiverc后 重新启动了hive客户端 hive>内来执行自定义函数的话,那么能够执行
因为此时hive客户端重新读到了 hiverc的文件
如果你是想通过 脚本来执行,比如你的自定义函数写在 xx.sql 通过
hive -t -S -h 192.168.20.200 -f /user/aaa.sql 方式,那么此时走的是hive server端,
需要重启hive后才能正确执行。
工作中 一般都是通过方式 b)来加载hive自定义函数,方便灵活,更不需要重启hive。