1,技术背景
在使用Hive的过程中,尤其是统计分析和数据分层清晰的场景下,有些自定义的业务场景使用自带函数无法实现,就需要借助自定义函数实现特有业务逻辑。此篇大概讲述下在hive里实现自定义函数: 根据图片的hash向量计算其汉明距离。
2,Java 实现部分
根据两张图片的16位16进制Hash向量计算汉明距离。自定义函数需要实现 org.apache.hadoop.hive.ql.exec.UDF 类。
public class HanmingCal extends UDF{
public Integer evaluate(String imgAHash, String imgBHash){
// 空串不处理
if(imgAHash == null || imgBHash == null){
return null;
}
// 定长
if(imgAHash.trim().length() != 16 || imgBHash.trim().length() != 16){
return null;
}
// 将16位Hash向量转成64位的二进制字符串
String imgABin = hexToBinary(imgAHash);
String imgBBin = hexToBinary(imgBHash);
// 使用异或算法计算汉明距离
return getHammingDistance(imgABin, imgBBin);
}
}
将该部分Java打包成.jar包文件(此处命名为:testUDF.jar)
3,在Hive中创建永久UDF
将. jar 导入HDFS 文件系统。
hadoop fs -put testUDF.jar /user/hive/udf/
创建UDF。
hive> create function hanmingCal as 'test.udf.HanmingCal' using jar 'hdfs://hadoop:8020/user/hive/udf/testUDF.jar';
测试。
hive> select hanmingCal('0113ae06f6feef5e','0112af05b7dece1c') from default.dual
其它操作。
# 查看所有函数
hive> show functions;
# 删除函数
hive> drop function hanmingCal;
4,总结
总体来说还是较简单的,没有难点。