更多精彩原創(chuàng)內容請關注:JavaInterview账锹,歡迎 star狡赐,支持鼓勵以下作者盈魁,萬分感謝栏豺。
Hive 函數(shù)
相信大家對 Hive 都不陌生彬碱,那么大家肯定用過 Hive 里面各種各樣的函數(shù)”疲可能大家都會使用這些函數(shù)堡妒,但是沒有自己動手去寫過 Hive 里面的函數(shù)。下面主要來介紹一下 Hive 里面的各種函數(shù)溉卓。
依賴
開發(fā) Hive UDF 之前,我們需要引入一個 jar搬泥,這個 jar 就是 hive-exec桑寨,里面定義了各種我們自定義的 UDF 函數(shù)的類型:UDF、GenericUDF忿檩、GenericUDTF 等尉尾。
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>2.1.1</version>
</dependency>
UDF(User-Defined-Function)
UDF:用戶自定義函數(shù),也是實現(xiàn)起來最簡單的一種函數(shù)燥透。支持的就是一進一出類型的函數(shù)沙咏。
如何實現(xiàn)?
繼承 UDF 類班套。
重寫 evaluate 方法肢藐。
將該 java 文件打包成 jar。
-
在 beeline(hive 的一種終端)中輸入如下命令:
0: jdbc:hive2://localhost:10000> add jar /data/tommyyang/HiveUDF.jar;
0: jdbc:hive2://localhost:10000> create temporary function ip2loc as 'cn.tommyyang.IPToLocation';
0: jdbc:hive2://localhost:10000> select ip2loc("118.28.1.1");
0: jdbc:hive2://localhost:10000> drop temporary function ip2loc;
具體代碼實現(xiàn):
@Description(
name = "ip2loc",
value = "_FUNC_(str) - covert ip to location",
extended = "Example:\n" +
" > SELECT ip2loc(ip) FROM ips;\n" +
" [中國,上海]"
)
public class IPToLocation extends UDF {
private static final InputStream stream = IPToLocation.class.getClassLoader().getResourceAsStream("ipipfree.ipdb");
private static City db = null;
static {
try {
db = new City(stream);
} catch (IOException e) {
e.printStackTrace();
}
}
// 具體實現(xiàn)邏輯
public ArrayList<String> evaluate(Text s) throws IOException, IPFormatException {
ArrayList<String> allTexts = new ArrayList<>();
if (s != null) {
CityInfo info = db.findInfo(s.toString(), "CN");
allTexts.add(info.getCountryName());
allTexts.add(info.getRegionName());
allTexts.add(info.getCityName());
}
return allTexts;
}
}
@Description 為該 UDF 的描述吱韭,你可以通過命令 desc function ip2loc查看具體的描述吆豹;如下圖: