2023-02-09
函數(shù) hive
在Hive中,系統(tǒng)內(nèi)置了很多的函數(shù),能夠處理很多場景的需求。但是即便提供的函數(shù)再豐富,依然不能滿足我們所有的需求,有時候?qū)τ谝恍┍容^復(fù)雜的需求,我們就可以自定義函數(shù),來實現(xiàn)自己想要的效果。這就是所謂的UDF函數(shù)。
UDF:User Defined Function。用戶自定義函數(shù),接收一行數(shù)據(jù),返回一行的結(jié)果。而且這也是在Hive開發(fā)的時候,最常用的函數(shù)之一。
1使用IDEA,創(chuàng)建Maven項目,并添加pom依賴:
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>3.1.2</version>
</dependency>
2設(shè)計類,繼承GenericUDF類,實現(xiàn)這個類中的抽象方法:
public class ReverseCaseUDF extends GenericUDF {
/**
* 執(zhí)行我們自己的業(yè)務(wù)邏輯之前的校驗,常用于校驗參數(shù)的數(shù)量、類型是否符合自己的需求
*/
@Override
public ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException {
return null;
}
/**
* 自己需要執(zhí)行的邏輯操作
*/
@Override
public Object evaluate(DeferredObject[] deferredObjects) throws HiveException {
return null;
}
@Override
public String getDisplayString(String[] strings) {
return null;
}
}
案例:自己實現(xiàn)concat_ws函數(shù)
1設(shè)計自己的UDF類
public class StringJoinUDF extends GenericUDF {
@Override
public ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException {
// 參數(shù)數(shù)量檢查
if (objectInspectors.length < 3) {
throw new UDFArgumentException("參數(shù)數(shù)量不正確!至少需要一個分隔符,兩個需要拼接的字符串");
}
return PrimitiveObjectInspectorFactory.javaStringObjectInspector;
}
@Override
public Object evaluate(DeferredObject[] deferredObjects) throws HiveException {
// 1. 獲取到分隔符
String separator = deferredObjects[0].get().toString();
// 2. 定義一個StringBuilder的字符串,用來拼接最后的結(jié)果
StringBuilder result = new StringBuilder();
// 3. 遍歷數(shù)組中的每一個參數(shù),從1開始
for (int i = 1; i < deferredObjects.length - 1; i++) {
result.append(deferredObjects[i].get().toString()).append(separator);
}
result.append(deferredObjects[deferredObjects.length - 1].get().toString());
return result.toString();
}
@Override
public String getDisplayString(String[] strings) {
return null;
}
}
2將項目打包,jar包上傳到Linux服務(wù)器,并保存到任意路徑上。
3創(chuàng)建自定義函數(shù)
# 1. 添加jar包到classpath
add jar ~/udf_1.0.jar
# 2. 創(chuàng)建臨時函數(shù)
create temporary function my_concat_ws as 'com.qf.hive.udf.FirstUDF';
# 3. 使用測試
select my_concat_ws(', ', 'Java', 'MySQL', 'Hive');
配置文件加載
自定義函數(shù)已經(jīng)實現(xiàn)了,但是無論是 add jar ,還是創(chuàng)建的臨時函數(shù),都是只針對當(dāng)前的會話生效的。當(dāng)我們重啟hive客戶端的時候,就無法再使用了,需要重新加載、配置一次。這樣做太麻煩了,有沒有一種方式,可以實現(xiàn)自動的加載呢?
我們可以通過將上述的操作寫入到配置文件中的形式來完成。在 $HIVE_HOME/conf 的目錄下,創(chuàng)建一個文件 .hiverc,這個文件會在hive客戶端啟動的時候,自動的加載。因此我們就可以將上述的 add jar 和 創(chuàng)建臨時函數(shù)的操作寫入到這個文件中即可。
因此,我們就必須要規(guī)劃好一個jar包保存的位置。這個位置可以是Linux本地的路徑,也可以是HDFS的路徑。
●Linux本地路徑,推薦存放在 $HIVE_HOME/lib 的目錄下。
●HDFS的路徑,可以創(chuàng)建自己的路徑,然后將jar包保存起來即可。
開班時間:2021-04-12(深圳)
開班盛況開班時間:2021-05-17(北京)
開班盛況開班時間:2021-03-22(杭州)
開班盛況開班時間:2021-04-26(北京)
開班盛況開班時間:2021-05-10(北京)
開班盛況開班時間:2021-02-22(北京)
開班盛況開班時間:2021-07-12(北京)
預(yù)約報名開班時間:2020-09-21(上海)
開班盛況開班時間:2021-07-12(北京)
預(yù)約報名開班時間:2019-07-22(北京)
開班盛況
Copyright 2011-2023 北京千鋒互聯(lián)科技有限公司 .All Right
京ICP備12003911號-5
京公網(wǎng)安備 11010802035720號