hive編寫udf實踐記錄
官方教程:https://cwiki.apache.org/confluence/display/Hive/HivePlugins
簡單使用檢視上面官方的文件即可。這裡記錄一下我使用的實踐和一點注意事項。
一 編寫udf
這裡的需求是寫一個udf,用於將經緯度轉換成geohash。引數有 經緯度和geohash的精度。
gradle配置
gradle 部分配置如下:
dependencies {
compile group: 'ch.hsr', name: 'geohash', version: '1.3.0'
compileOnly group: 'org.apache.hive', name: 'hive-exec', version: '2.3.6'
}
task fatJar(type: Jar) {
//baseName = project.name
baseName = 'hiveFunction'
project.fileTree("$buildDir/fatjar/libs").forEach { jarFile ->
from zipTree(jarFile )
}
with jar
destinationDir = file("$buildDir/fatjar")
}
task copyToLib(type: Copy) {
into "$buildDir/fatjar/libs"
from configurations.runtime
}
UDF類
GeoHashUDF.java 程式碼如下:
這裡需要注意的就是註釋的寫法,以及異常的處理。
因為在hive執行的過程中,如果udf拋一個異常出來,有可能會導致整個hive sql執行的失敗。所以,對於業務異常,應該避免向外丟擲。
以本geohash的udf為例,如果給定的經緯度不合法,則可返回用0填充的預設字串。
import ch.hsr.geohash.GeoHash;
import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDF;
import java.util.HashMap;
import java.util.Map;
@Description(
name = "geohash",
value = "_FUNC_(double lat,double lon,int precison) - Returns geohash",
extended = "Example:\n > SELECT _FUNC_(\'20.1,111.2,6\') FROM src LIMIT 1;\n \'hello:Facebook\'"
)
public class GeoHashUDF extends UDF {
private static Map<Integer,String> defaultValueMap = new HashMap<> ();
static {
StringBuilder sb = new StringBuilder("");
for(int i = 0; i < 20; i++){
defaultValueMap.put(i,sb.toString());
sb.append(0);
}
}
public String evaluate (Double lat,Double lon,Integer precision) {
try {
return GeoHash.geoHashStringWithCharacterPrecision(lat, lon, precision);
}catch (Exception e) {
return defaultValueMap.get(precision);
}
}
public static void main(String[] args) {
System.out.println(new GeoHashUDF().evaluate(20.1,111.2,6));
}
}
打jar包
先執行gradle copyToLib,再執行 gradle fatJar
得到 hiveFunction.jar
二 建立function
1 建立臨時function
- 先將生成的jar包新增到hive的lib目錄下
\cp -f hiveFunction.jar $HIVE_HOME/lib/
- 再在hive shell裡面執行以下命令即可,注意要使用全稱類名
create temporary function geohash as 'GeoHashUDF';
- 刪除
drop temporary function if exists geohash;
2 建立永久function
- 上傳jar包到hdfs上
hadoop fs -rm /my/hive/libs/hiveFunction.jar
hadoop fs -put hiveFunction.jar /my/hive/libs/hiveFunction.jar
- 建立永久函式
create function geohash as 'com.yaoyun.anyonedev.hive.function.GeoHashUDF' using jar 'hdfs:///my/hive/libs/hiveFunction.jar';
- 刪除
drop function if exists geohash;
相關文章
- Hive UDF,就這Hive
- hive學習筆記之九:基礎UDFHive筆記
- hive原始碼編譯(失敗記錄)Hive原始碼編譯
- Hive中的UDF詳解Hive
- Apache Phoenix自定義函式(UDF)實踐Apache函式
- flink實戰--讀寫Hive(Flink on Hive)Hive
- Hive實戰UDF 外部依賴檔案找不到的問題Hive
- Hive Tutorial 閱讀記錄Hive
- 編寫 Android Library 的最佳實踐Android
- gmssl實踐截圖記錄
- 自己動手寫Impala UDF
- dart系列之:手寫Library,Library編寫最佳實踐Dart
- ROS小車實踐記錄(五)ROS
- 編寫架構文件的最佳實踐 - Singh架構
- 編寫git commit資訊的最佳實踐GitMIT
- 編寫優雅程式碼的最佳實踐
- Hive效能調優實踐 - VidhyaHive
- H264編碼分析及隱寫實踐
- Spring Boot 編寫 API 的 10條最佳實踐Spring BootAPI
- 蜻蜓安全編寫外掛模組 webcrack 實踐Web
- 【譯】編寫git commit資訊的最佳實踐GitMIT
- DevOps GitLab CICD 實踐3——CI檔案編寫devGitlab
- Atlas 2.1.0 實踐(3)—— Atlas整合HIveHive
- Hive函式(內建函式+自定義標準函式UDF)Hive函式
- 記錄下實踐過的演算法演算法
- 【翻譯】編寫程式碼註釋的最佳實踐
- Docker 版 GitLab CICD 實踐3——CI檔案編寫DockerGitlab
- 編寫高效能 Java 程式碼的最佳實踐Java
- Flink實戰之寫Hive效能問題Hive
- 寫題記錄3
- 寫題記錄1
- Python使用ClickHouse的實踐與踩坑記錄Python
- [Hive]用concat_w實現將多行記錄合併成一行Hive
- EFK 配置geo-ip落地實踐(二)fluentd外掛編寫
- DevOps落地實踐點滴和踩坑記錄-(1)dev
- Arctic 基於 Hive 的流批一體實踐Hive
- Hive常用效能優化方法實踐全面總結Hive優化
- Latex — 寫作編譯過程中遇到問題記錄與總結編譯