近期在学习大数据的过程中,使用了CDH版本的Hadoop、Hive等,将编写Hive自定义函数UDF的过程记下来,以备查看和参考。
开发环境:JDK1.8、IEDA 2018.3.5
操作环境:安装了CDH版本的大数据组件的Linux系统(虚拟机),包括了Hadoop、Hive、Sqoop
(1)贴上pom.xml的内容
4.0.0
com.fanling
hivedemo
jar
1.0.0
cloudera
cloudera-repository
https://repository.cloudera.com/artifactory/cloudera-repos/
default
true
false
org.apache.hadoop
hadoop-client
2.6.0-cdh5.14.2
org.apache.hive
hive-exec
1.1.0-cdh5.14.2
org.apache.hive
hive-jdbc
1.1.0-cdh5.14.2
mysql
mysql-connector-java
5.1.27
org.apache.maven.plugins
maven-compiler-plugin
1.8
在初始化环境的时候,遇到了jar包无法下载的问题,本地maven配置了阿里源,阿里源中没有cdh版本的jar包,于是在pom.xml中添加了指定仓库
cloudera
cloudera-repository
https://repository.cloudera.com/artifactory/cloudera-repos/
default
true
false
然而没有生效,还是从settings.xml中读取下载地址,经过排查发现是settings.xml中的mirrorOf节点配置错误,让所有jar包都通过此镜像下载,*表示所有的资源,添加,!cloudera表示除了cloudera,其他用法请自行查阅,不再说明。
修改为如下
nexus-aliyun
*,!cloudera
Nexus aliyun
http://maven.aliyun.com/nexus/content/groups/public
重新导入jar,环境搭建成功!
package com.fanling.hivedemo;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
public class MyUDF extends UDF {
public Text evaluate(Text field) {
if (field == null) {
return null;
} else {
return new Text(field.toString().toLowerCase());
}
}
}
继承 org.apache.hadoop.hive.ql.exec.UDF,并且实现evaluate方法,支持重载。
完成以上编码后,在本地输入字符进行测试,输入大写字母,将输出小写字母
package com.fanling.hivedemo;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
public class MyUDF extends UDF {
public Text evaluate(Text field) {
if (field == null) {
return null;
} else {
return new Text(field.toString().toLowerCase());
}
}
public static void main(String[] args) {
System.out.println(new MyUDF().evaluate(new Text("FANLING")));
}
}
// 输出结果
fanling
Process finished with exit code 0
通过mvn 打jar包,上传到Linux用于跟目录上。
如果出现报错:
could not be resolved:
org.pentaho:pentaho-aggdesigner-algorithm:jar:5.1.5-jhyde,
eigenbase:eigenbase-properties:jar:1.1.4:
解决:下载jar包到本地仓库对应路径。
pentaho-aggdesigner-algorithm-5.1.5-jhyde.jar下载地址 | eigenbase-properties-1.1.4.jar下载地址
hive (default)> add jar /home/fanl/lib/hivedemo-1.0.0.jar;
Added [/home/fanl/lib/hivedemo-1.0.0.jar] to class path
Added resources: [/home/fanl/lib/hivedemo-1.0.0.jar]
hive (default)> create temporary function mylowwer as 'com.fanling.hivedemo.MyUDF';
OK
Time taken: 0.274 seconds
hive (default)> select mylowwer(ename) from emp;
OK
_c0
smith
allen
ward
cloudera仓库缺少的jar包可以从maven中央仓库下载。