hive編寫udf實踐記錄

鯨臨於空發表於2020-11-10

官方教程: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

  1. 先將生成的jar包新增到hive的lib目錄下
\cp -f hiveFunction.jar $HIVE_HOME/lib/

  1. 再在hive shell裡面執行以下命令即可,注意要使用全稱類名
create temporary function geohash as 'GeoHashUDF';

  1. 刪除
drop temporary function if exists geohash;

2 建立永久function

  1. 上傳jar包到hdfs上
hadoop fs -rm /my/hive/libs/hiveFunction.jar
hadoop fs -put hiveFunction.jar /my/hive/libs/hiveFunction.jar
  1. 建立永久函式
create function geohash as 'com.yaoyun.anyonedev.hive.function.GeoHashUDF' using jar 'hdfs:///my/hive/libs/hiveFunction.jar';

  1. 刪除
drop function if exists geohash;

相關文章