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")