hive 中自定义 base64 加密 解密 UDF 函数

一、maven依赖 


        
            org.apache.hadoop
            hadoop-client
            2.7.3
        
        
            org.apache.hive
            hive-exec
            1.2.1
        
    

    
        
            
                org.apache.maven.plugins
                maven-shade-plugin
                1.4
                
                    
                        package
                        
                            shade
                        
                        
                            
                                
                                    *:*
                                    
                                        META-INF/*.SF
                                        META-INF/*.DSA
                                        META-INF/*.RSA
                                    
                                
                            

                            
                                
                                    META-INF/spring.handlers
                                
                                
                                    com.neu.hive.UDF.ToUpperCaseUDF
                                
                                
                                    META-INF/spring.schemas
                                
                            
                        
                    
                
            
        
    

 二、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操作界面

hive 中自定义 base64 加密 解密 UDF 函数_第1张图片

六、将上传的jar添加至hive的classpath中,如下指令

指令:add jar /opt/hive/udf/encode-and-decode.jar;

注意:后面的路径是我放打好的udf  的jar包的路径;

七、查看jar包是否存在

指令:list jar;

如图:

hive 中自定义 base64 加密 解密 UDF 函数_第2张图片

八、创建我们的udf函数

指令:create temporary function encode as 'com.zdww.dsj.udf.Encode';

注:以上指令是:create temporary function + 自定义UDF函数名称 + as + 编写这个Encode类的路径

hive 中自定义 base64 加密 解密 UDF 函数_第3张图片

上面截图所示类的路径;

九、查看是否存在我们自定义UDF函数

指令:show functions;

hive 中自定义 base64 加密 解密 UDF 函数_第4张图片

十、使用自定义UDF函数

例如:

select encode(name) from dw.mps_event;

注:encode() 中encode是我们自定义函数名称,()里面传入我们需要加密或者解密的参数

结果如图:

hive 中自定义 base64 加密 解密 UDF 函数_第5张图片

删除临时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

如图:

hive 中自定义 base64 加密 解密 UDF 函数_第6张图片

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;

 

你可能感兴趣的:(big,data)