1,技術背景
在使用(yong)Hive的(de)(de)過程(cheng)中,尤其是(shi)統計分析和數據分層清(qing)晰的(de)(de)場景(jing)下,有些自定(ding)義的(de)(de)業務(wu)場景(jing)使用(yong)自帶函(han)數無法實(shi)現(xian),就(jiu)需要借助自定(ding)義函(han)數實(shi)現(xian)特有業務(wu)邏輯。此(ci)篇大概講述下在hive里實(shi)現(xian)自定(ding)義函(han)數: 根據圖片的(de)(de)hash向(xiang)量計算其漢明(ming)距離。
2,Java 實現部分
根據兩張(zhang)圖片(pian)的16位16進制Hash向(xiang)量計(ji)算漢明距(ju)離。自定義函數需要實現(xian) org.apache.hadoop.hive.ql.exec.UDF 類(lei)。
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打包(bao)成.jar包(bao)文件(jian)(此處(chu)命(ming)名為:testUDF.jar)
3,在Hive中創建(jian)永久UDF
將(jiang). 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,總結
總體來說還是較簡單的,沒有難(nan)點。