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;
原文地址:https://www.cnblogs.com/30go/p/11305370.html