隔着超薄肉丝进入小说_男女刺激性视频大片_女教师的诱波多野结衣_一级欧美过瘾大片

當(dāng)前位置: 首頁(yè) / 技術(shù)干貨 / 正文
Hive的UDF函數(shù)

2023-02-09

   函數(shù) hive

  在Hive中,系統(tǒng)內(nèi)置了很多的函數(shù),能夠處理很多場(chǎng)景的需求。但是即便提供的函數(shù)再豐富,依然不能滿足我們所有的需求,有時(shí)候?qū)τ谝恍┍容^復(fù)雜的需求,我們就可以自定義函數(shù),來(lái)實(shí)現(xiàn)自己想要的效果。這就是所謂的UDF函數(shù)。

  UDF:User Defined Function。用戶自定義函數(shù),接收一行數(shù)據(jù),返回一行的結(jié)果。而且這也是在Hive開(kāi)發(fā)的時(shí)候,最常用的函數(shù)之一。

  1使用IDEA,創(chuàng)建Maven項(xiàng)目,并添加pom依賴:

<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>3.1.2</version>
</dependency>

  2設(shè)計(jì)類(lèi),繼承GenericUDF類(lèi),實(shí)現(xiàn)這個(gè)類(lèi)中的抽象方法:

  public class ReverseCaseUDF extends GenericUDF {

  /**

  * 執(zhí)行我們自己的業(yè)務(wù)邏輯之前的校驗(yàn),常用于校驗(yàn)參數(shù)的數(shù)量、類(lèi)型是否符合自己的需求

  */

  @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;

  }

  }

  案例:自己實(shí)現(xiàn)concat_ws函數(shù)

  1設(shè)計(jì)自己的UDF類(lèi)

  public class StringJoinUDF extends GenericUDF {

  @Override

  public ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException {

  // 參數(shù)數(shù)量檢查

  if (objectInspectors.length < 3) {

  throw new UDFArgumentException("參數(shù)數(shù)量不正確!至少需要一個(gè)分隔符,兩個(gè)需要拼接的字符串");

  }

  return PrimitiveObjectInspectorFactory.javaStringObjectInspector;

  }

  @Override

  public Object evaluate(DeferredObject[] deferredObjects) throws HiveException {

  // 1. 獲取到分隔符

  String separator = deferredObjects[0].get().toString();

  // 2. 定義一個(gè)StringBuilder的字符串,用來(lái)拼接最后的結(jié)果

  StringBuilder result = new StringBuilder();

  // 3. 遍歷數(shù)組中的每一個(gè)參數(shù),從1開(kāi)始

  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將項(xiàng)目打包,jar包上傳到Linux服務(wù)器,并保存到任意路徑上。

  3創(chuàng)建自定義函數(shù)

# 1. 添加jar包到classpath
add jar ~/udf_1.0.jar

# 2. 創(chuàng)建臨時(shí)函數(shù)
create temporary function my_concat_ws as 'com.qf.hive.udf.FirstUDF';

# 3. 使用測(cè)試
select my_concat_ws(', ', 'Java', 'MySQL', 'Hive');

  配置文件加載

  自定義函數(shù)已經(jīng)實(shí)現(xiàn)了,但是無(wú)論是 add jar ,還是創(chuàng)建的臨時(shí)函數(shù),都是只針對(duì)當(dāng)前的會(huì)話生效的。當(dāng)我們重啟hive客戶端的時(shí)候,就無(wú)法再使用了,需要重新加載、配置一次。這樣做太麻煩了,有沒(méi)有一種方式,可以實(shí)現(xiàn)自動(dòng)的加載呢?

  我們可以通過(guò)將上述的操作寫(xiě)入到配置文件中的形式來(lái)完成。在 $HIVE_HOME/conf 的目錄下,創(chuàng)建一個(gè)文件 .hiverc,這個(gè)文件會(huì)在hive客戶端啟動(dòng)的時(shí)候,自動(dòng)的加載。因此我們就可以將上述的 add jar 和 創(chuàng)建臨時(shí)函數(shù)的操作寫(xiě)入到這個(gè)文件中即可。

  因此,我們就必須要規(guī)劃好一個(gè)jar包保存的位置。這個(gè)位置可以是Linux本地的路徑,也可以是HDFS的路徑。

  ●Linux本地路徑,推薦存放在 $HIVE_HOME/lib 的目錄下。

  ●HDFS的路徑,可以創(chuàng)建自己的路徑,然后將jar包保存起來(lái)即可。

好程序員公眾號(hào)

  • · 剖析行業(yè)發(fā)展趨勢(shì)
  • · 匯聚企業(yè)項(xiàng)目源碼

好程序員開(kāi)班動(dòng)態(tài)

More+
IT培訓(xùn)IT培訓(xùn)
在線咨詢
IT培訓(xùn)IT培訓(xùn)
試聽(tīng)
IT培訓(xùn)IT培訓(xùn)
入學(xué)教程
IT培訓(xùn)IT培訓(xùn)
立即報(bào)名
IT培訓(xùn)

Copyright 2011-2023 北京千鋒互聯(lián)科技有限公司 .All Right 京ICP備12003911號(hào)-5 京公網(wǎng)安備 11010802035720號(hào)