2021年大数据Hive(八):Hive自定义函数
全網最詳細的Hive文章系列,強烈建議收藏加關注!
后面更新文章都會列出歷史文章目錄,幫助大家回顧知識重點。
目錄
系列歷史文章
前言
Hive自定義函數
一、概述
1、UDF(User-Defined-Function)
2、UDAF(User-Defined Aggregation Function)
3、UDTF(User-Defined Table-Generating Functions)
二、自定義UDF
1、代碼編寫
2、函數使用方式1-臨時函數
3、函數使用方式2-永久函數
三、自定義UDTF
1、需求
2、代碼實現
3、添加我們的jar包
4、創建臨時函數與開發后的udtf代碼關聯
???????5、使用自定義udtf函數
系列歷史文章
2021年大數據Hive(十二):Hive綜合案例!!!???????
2021年大數據Hive(十一):Hive調優
2021年大數據Hive(十):Hive的數據存儲格式
2021年大數據Hive(九):Hive的數據壓縮???????
2021年大數據Hive(八):Hive自定義函數
2021年大數據Hive(七):Hive的開窗函數
2021年大數據Hive(六):Hive的表生成函數
2021年大數據Hive(五):Hive的內置函數(數學、字符串、日期、條件、轉換、行轉列)
2021年大數據Hive(四):Hive查詢語法
2021年大數據Hive(三):手把手教你如何吃透Hive數據庫和表操作(學會秒變數倉大佬)
2021年大數據Hive(二):Hive的三種安裝模式和MySQL搭配使用
2021年大數據Hive(一):Hive基本概念
前言
?2021大數據領域優質創作博客,帶你從入門到精通,該博客每天更新,逐漸完善大數據各個知識體系的文章,幫助大家更高效學習。
有對大數據感興趣的可以關注微信公眾號:三幫大數據
Hive自定義函數
一、概述
Hive 自帶了一些函數,比如:max/min等,但是數量有限,自己可以通過自定義UDF來方便的擴展。
當Hive提供的內置函數無法滿足你的業務處理需要時,此時就可以考慮使用用戶自定義函數(UDF:user-defined function)。
根據用戶自定義函數類別分為以下三種:
1、UDF(User-Defined-Function)
一進一出 ?
類似于:lower/lower/reverse
2、UDAF(User-Defined Aggregation Function)
聚集函數,多進一出
類似于:count/max/min
3、UDTF(User-Defined Table-Generating Functions)
一進多出
如lateral view explode()
二、自定義UDF
編程步驟:
(1)繼承org.apache.hadoop.hive.ql.exec.UDF
(2)需要實現evaluate函數;evaluate函數支持重載;
注意事項:
(1)UDF必須要有返回類型,可以返回null,但是返回類型不能為void;
(2)UDF中常用Text/LongWritable等類型,不推薦使用java類型;
???????1、代碼編寫
第一步:創建maven ?java 工程,導入jar包
<dependencies><dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>2.1.0</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>2.7.5</version></dependency></dependencies>
第二步:開發java類繼承UDF,并重載evaluate 方法
public?class?MyUDF ?extends?UDF{public?Text evaluate(final Text s)?{if?(null?==?s)?{return?null;}//返回大寫字母return?new?Text(s.toString().toLowerCase());}}
???????2、函數使用方式1-臨時函數
1、將我們的項目打包,并上傳到hive的lib目錄下
2、添加我們的jar包
將jar包上傳到?/export/server/hive-2.1.0/lib目錄,并重命名我們的jar包名稱
cd /export/server/hive-2.1.0/libmv original-day_10_hive_udf-1.0-SNAPSHOT.jar my_lower.jar
3、hive的客戶端添加我們的jar包
hive>add?jar /export/server/hive-2.1.0/lib/my_lower.jar
???????
4、設置函數與我們的自定義函數關聯-臨時函數
hive>create?temporary?function?my_lower as?'cn.it.udf.MyUDF';
5、使用自定義函數
hive>select?my_lower('abc');
???????3、函數使用方式2-永久函數
1.?把自定義函數的jar上傳到hdfs中.hadoop fs -mkdir /hive_funchadoop fs -put my_lower.jar /hive_func ?2.?創建永久函數hive>??create?function?my_lower2 as?'cn.it.udf.MyUDF'?using?jar 'hdfs://node1:8020/hive_func/my_lower.jar';3.?驗證hive>?select?my_lower2("Hello World");
三、自定義UDTF
???????1、需求
自定義一個UDTF,實現將一個任意分隔符的字符串切割成獨立的單詞,例如:
源數據:"zookeeper,hadoop,hdfs,hive,MapReduce"目標數據:zookeeperhadoophdfshiveMapReduce
???????2、代碼實現
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;import org.apache.hadoop.hive.ql.metadata.HiveException;import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;import java.util.ArrayList;import java.util.List;import java.util.function.ObjDoubleConsumer;public?class?MyUDTF extends?GenericUDTF {private?final transient Object[]?forwardListObj =?new?Object[1];@Overridepublic?StructObjectInspector initialize(StructObjectInspector argOIs)?throws UDFArgumentException {//設置列名的類型List<String>?fieldNames =?new?ArrayList<>();//設置列名fieldNames.add("column_01");List<ObjectInspector>?fieldOIs =?new?ArrayList<ObjectInspector>()??;//檢查器列表//設置輸出的列的值類型fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);return?ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames,?fieldOIs);}@Overridepublic?void process(Object[]?objects)?throws HiveException {//1:獲取原始數據String args =?objects[0].toString();//2:獲取數據傳入的第二個參數,此處為分隔符String splitKey =?objects[1].toString();//3.將原始數據按照傳入的分隔符進行切分String[]?fields =?args.split(splitKey);//4:遍歷切分后的結果,并寫出for?(String field :?fields)?{//將每一個單詞添加值對象數組forwardListObj[0]?=?field;//將對象數組內容寫出forward(forwardListObj);}}@Overridepublic?void close()?throws HiveException {}}
???????3、添加我們的jar包
將打包的jar包上傳到node3主機/export/data/hive-2.1.0/lib目錄,并重命名我們的jar包名稱
cd /export/data/hive-2.1.0/libmv original-day_10_hive_udtf-1.0-SNAPSHOT.jar my_udtf.jar
hive的客戶端添加我們的jar包,將jar包添加到hive的classpath下
hive> add jar /export/server/hive-2.1.0/lib/my_udtf.jar;
???????4、創建臨時函數與開發后的udtf代碼關聯
hive>create?temporary?function?my_udtf as?'cn.itcast.udtf.MyUDTF';
???????5、使用自定義udtf函數
hive>select?my_udtf("zookeeper,hadoop,hdfs,hive,MapReduce",",")?word;
- 📢博客主頁:https://lansonli.blog.csdn.net
- 📢歡迎點贊 👍 收藏 ?留言 📝 如有錯誤敬請指正!
- 📢本文由 Lansonli 原創,首發于 CSDN博客🙉
- 📢大數據系列文章會每天更新,停下休息的時候不要忘了別人還在奔跑,希望大家抓緊時間學習,全力奔赴更美好的生活?
總結
以上是生活随笔為你收集整理的2021年大数据Hive(八):Hive自定义函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021年大数据Hive(七):Hive
- 下一篇: 2021年大数据Hive(九):Hive