一、maven依赖
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>1.2.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.neu.hive.UDF.ToUpperCaseUDF</mainClass>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
二、base64 解密代码
public class Decode extends UDF {
private static final Logger log = Logger.getLogger(Decode.class);
private static final String charset = "utf-8";
public String evaluate(String param){
if (param == null) {
return null;
}
byte[] bytes = Base64.decodeBase64(param);
try {
String res = new String(bytes,charset);
return res;
} catch (UnsupportedEncodingException e) {
log.error(String.format("字符串:{}解密失败",param),e);
}
return null;
}
三、base64加密代码
public class Encode extends UDF {
private static final Logger log = Logger.getLogger(Encode.class);
private static final String charset = "utf-8";
public String evaluate(String param){
if (param == null){
return null;
}
try {
return new String(Base64.encodeBase64(param.getBytes(charset)), charset);
} catch (UnsupportedEncodingException e) {
log.error(String.format("字符串:%s加密异常",param),e);
}
return null;
}
注:如上代码所示:
1、自定义hive 的UDF函数需要继承UDF
2、自定义方法需要实现evaluate方法,否则不能生效,evaluate方法可以重载
四、打包编译上传服务器任意目录,如下图所示
五、进入hive操作界面
六、将上传的jar添加至hive的classpath中,如下指令
指令:add jar /opt/hive/udf/encode-and-decode.jar;
注意:后面的路径是我放打好的udf 的jar包的路径;
七、查看jar包是否存在
指令:list jar;
如图:
八、创建我们的udf函数
指令:create temporary function encode as 'com.zdww.dsj.udf.Encode';
注:以上指令是:create temporary function + 自定义UDF函数名称 + as + 编写这个Encode类的路径
上面截图所示类的路径;
九、查看是否存在我们自定义UDF函数
指令:show functions;
十、使用自定义UDF函数
例如:
select encode(name) from dw.mps_event;
注:encode() 中encode是我们自定义函数名称,()里面传入我们需要加密或者解密的参数
结果如图:
删除临时UDF函数指令:
drop temporary function encode;
注:encode 是UDF函数名称;
十一、特别注意:
以上创建的UDF函数只是临时的UDF函数,只会存在于此时所开的黑窗口界面使用,如果令开一个hive操作界面,我们定义的UDF函数就不能使用了;所以如下 给出创建全局UDF函数
十二、创建全局(永久)UDF函数
1、在hdfs上创建一个/lib目录
指令:hadoop fs -mkdir /lib
2、将我们之前存放在服务器中的jar上传到我们创建的lib目录下
指令:hadoop fs -put /opt/hive/udf/encode-and-decode.jar /lib
如图:
3、hive操作界面创建永久函数
指令:
create function test_encode as 'com.zdww.dsj.udf.Encode' using jar 'hdfs://zdww-dsj/lib/encode-and-decode.jar';
注:create function + 自定义函数名称 + as + 编写这个Encode类的路径 + using jar + hdfs上的jar所在路径;
4、如上全局的UDF函数即创建好
注:可以在hive的元数据库中查看FUNCS表,会有自定义全局UDF函数的信息;
5、删除UDF:
指令:drop function test_encode;