• hive中function函数查询


    1. desc function [函数名]

    desc function xpath;

     查询用法:

    2. desc function extended [函数名]

    desc function extended xpath;

     查询使用举例:

    3. 自定义函数添加说明:

    使用@Description注解

    name: 指定函数名 

    value: 函数说明

    extended:函数的例子

    /**
     * 解密udf
     */
    @Description(
            name="decrypt_all",
            value=" decrypt_all(decryptType, args ... ) - Returns default value if value is null else returns value",
            extended = "Example:
    > "
                    + " decrypt_all('AES', '123456','password')  --password长度16位 
     "
                    + " decrypt_all('AES16', '123456','password') --password长度16位 
     "
                    + " decrypt_all('DES', '123456','key') --key长度16位 
     "
                    + " decrypt_all('3DES', '123456','key')  
     "
                    + "
    "
    )
    public class DecryptAll extends GenericUDF {
    
        private static final String[] decryptType = {"AES","AES16","DES","3DES"};
    
        //这个方法只调用一次,并且在evaluate()方法之前调用。该方法接受的参数是一个ObjectInspectors数组。该方法检查接受正确的参数类型和参数个数。
        @Override
        public ObjectInspector initialize(ObjectInspector[] args) throws UDFArgumentException {
            if(args.length < 2){
                throw new UDFArgumentLengthException(" args length must be greater than or equal to 2");
            }
            String encryptValue = args[0].toString();
            if(!Arrays.asList(decryptType).contains(encryptValue)){
                throw new UDFArgumentLengthException("decrypt type error, only support 'AES','AES16','DES','3DES'");
            }
            return null;
        }
    
        //这个方法类似UDF的evaluate()方法。它处理真实的参数,并返回最终结果。
        @Override
        public Object evaluate(DeferredObject[] args) throws HiveException {
            int length = args.length;
            String encryptValue = args[0].get().toString();
            String arg1 = args[1].get().toString();
            String arg2 = length > 2 ? args[2].get().toString() : null;
            int index = Arrays.binarySearch(decryptType, encryptValue.toUpperCase());
            if(index > 0){
                switch (index){
                    case 0: //aes
                        return  SecurityUtil.aesDecrypt(arg1,arg2);
                    case 1: //aes16
                        return SecurityUtil.aesDecryptKey16(arg1,arg2);
                    case 2: //des
                        return SecurityUtil.desDecrypt(arg1,arg2);
                    case 3: //3des
                        return SecurityUtil.threeDesDecrypt(arg1,arg2);
                }
            }
            return null;
        }
    
        //这个方法用于当实现的GenericUDF出错的时候,打印出提示信息。而提示信息就是你实现该方法最后返回的字符串。
        @Override
        public String getDisplayString(String[] strings) {
            return null;
        }
    }

    4. 添加udf三部曲

       编写java程序,并打包jar

       添加jar文件:

    # 直接放本地, 需要每个节点都布置一套
    add jar /opt/local/hive/udf/encryptAll-1.0.jar;
    
    # 最好将文件放到hdfs上,只需要一次性部署
    add jar hdfs://nameservice1/udf/encryptAll-1.0.jar;

      创建函数:

    create temporary function encrypt_all as 'com.xxx.udf.EncryptAll';

    5. udf中如何使用hdfs上的文件

    下面偶然看到别人写的,未测试

    hive -e "
    add jar ../../jar/bigdata_mxhz.jar ../../jar/BigDataUdf-1.1.jar;
    set mapred.cache.files=/data/index/tv_model.csv#tv_model.csv;
    "
    
    在udf中可以直接读取该文件 new FileReader("tv_model.csv")

     6. 创建永久函数

    create function default.encrypt_name as 'com.xxx.BankUDF' using jar 'hdfs://ns1/user/king/encryptAll.jar';
    
    drop function default.encrypt_name;
  • 相关阅读:
    带不带protype的区别
    一些方法(自己的认知)
    事件
    简单笔记
    freemarker Velocity获取request,session
    Freemaker中使用中括号来包含标签
    FreeMarker自定义标签
    Velocity模版自定义标签
    前端常用代码
    Eclipse中配置Ehcache提示信息
  • 原文地址:https://www.cnblogs.com/30go/p/11305370.html
Copyright © 2020-2023  润新知