国产精品色哟哟_男男激情3p互攻_色偷偷影院_和女同学厕所做了四次

當前位置: 首頁 / 技術干貨 / 正文
Hive的UDF函數

2023-02-09

   函數 hive

  在Hive中,系統內置了很多的函數,能夠處理很多場景的需求。但是即便提供的函數再豐富,依然不能滿足我們所有的需求,有時候對于一些比較復雜的需求,我們就可以自定義函數,來實現自己想要的效果。這就是所謂的UDF函數。

  UDF:User Defined Function。用戶自定義函數,接收一行數據,返回一行的結果。而且這也是在Hive開發的時候,最常用的函數之一。

  1使用IDEA,創建Maven項目,并添加pom依賴:

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

  2設計類,繼承GenericUDF類,實現這個類中的抽象方法:

  public class ReverseCaseUDF extends GenericUDF {

  /**

  * 執行我們自己的業務邏輯之前的校驗,常用于校驗參數的數量、類型是否符合自己的需求

  */

  @Override

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

  return null;

  }

  /**

  * 自己需要執行的邏輯操作

  */

  @Override

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

  return null;

  }

  @Override

  public String getDisplayString(String[] strings) {

  return null;

  }

  }

  案例:自己實現concat_ws函數

  1設計自己的UDF類

  public class StringJoinUDF extends GenericUDF {

  @Override

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

  // 參數數量檢查

  if (objectInspectors.length < 3) {

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

  }

  return PrimitiveObjectInspectorFactory.javaStringObjectInspector;

  }

  @Override

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

  // 1. 獲取到分隔符

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

  // 2. 定義一個StringBuilder的字符串,用來拼接最后的結果

  StringBuilder result = new StringBuilder();

  // 3. 遍歷數組中的每一個參數,從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服務器,并保存到任意路徑上。

  3創建自定義函數

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

# 2. 創建臨時函數
create temporary function my_concat_ws as 'com.qf.hive.udf.FirstUDF';

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

  配置文件加載

  自定義函數已經實現了,但是無論是 add jar ,還是創建的臨時函數,都是只針對當前的會話生效的。當我們重啟hive客戶端的時候,就無法再使用了,需要重新加載、配置一次。這樣做太麻煩了,有沒有一種方式,可以實現自動的加載呢?

  我們可以通過將上述的操作寫入到配置文件中的形式來完成。在 $HIVE_HOME/conf 的目錄下,創建一個文件 .hiverc,這個文件會在hive客戶端啟動的時候,自動的加載。因此我們就可以將上述的 add jar 和 創建臨時函數的操作寫入到這個文件中即可。

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

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

  ●HDFS的路徑,可以創建自己的路徑,然后將jar包保存起來即可。

分享: 更多

上一篇:Hive的分區表

下一篇:Hive的內部表和外部表

好程序員公眾號

  • · 剖析行業發展趨勢
  • · 匯聚企業項目源碼

好程序員開班動態

More+
  • HTML5大前端 <高端班>

    開班時間:2021-04-12(深圳)

    開班盛況

    開班時間:2021-05-17(北京)

    開班盛況
  • 大數據+人工智能 <高端班>

    開班時間:2021-03-22(杭州)

    開班盛況

    開班時間:2021-04-26(北京)

    開班盛況
  • JavaEE分布式開發 <高端班>

    開班時間:2021-05-10(北京)

    開班盛況

    開班時間:2021-02-22(北京)

    開班盛況
  • Python人工智能+數據分析 <高端班>

    開班時間:2021-07-12(北京)

    預約報名

    開班時間:2020-09-21(上海)

    開班盛況
  • 云計算開發 <高端班>

    開班時間:2021-07-12(北京)

    預約報名

    開班時間:2019-07-22(北京)

    開班盛況
IT培訓IT培訓
在線咨詢
IT培訓IT培訓
試聽
IT培訓IT培訓
入學教程
IT培訓IT培訓
立即報名
IT培訓

Copyright 2011-2023 北京千鋒互聯科技有限公司 .All Right 京ICP備12003911號-5 京公網安備 11010802035720號