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:\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三部曲

   編寫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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM