hive中function函數查詢

1. desc function [函數名]java

desc function xpath;

 查詢用法:數組

 

2. desc function extended [函數名]ide

desc function extended xpath;

 查詢使用舉例:函數

 

3. 自定義函數添加說明:測試

使用@Description註解lua

name: 指定函數名 spa

value: 函數說明3d

extended:函數的例子code

/**
 * 解密udf
 */
@Description(
        name="decrypt_all",
        value=" decrypt_all(decryptType, args ... ) - Returns default value if value is null else returns value",
        extended = "Example:\n> "
                + " decrypt_all('AES', '123456','password')  --password長度16位 \n "
                + " decrypt_all('AES16', '123456','password') --password長度16位 \n "
                + " decrypt_all('DES', '123456','key') --key長度16位 \n "
                + " decrypt_all('3DES', '123456','key')  \n "
                + "\n"
)
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三部曲blog

   編寫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")
相關文章
相關標籤/搜索