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;