一 、自定義UDF函數
前期准備
在maven工程中導入依賴
<dependencies> <!-- https://mvnrepository.com/artifact/org.apache.hive/hive-exec --> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>1.2.1</version> </dependency> </dependencies> <!-- 打包的配置 --> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <artifactId>maven-assembly-plugin </artifactId> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>wccount.MyWcDriver</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
代碼走起
注意點:1、類需要繼承org.apache.hadoop.hive.ql.UDF
2、方法名必須是evaluate,支持重載;
3、必須要有返回類型,可以返回null,但是返回類型不能為void;
public class MYUDF extends UDF { public int evaluate (int num ){ return num + 10; } }
hive中配置
1、首先利用maven打包,把jar包放入hive目錄下的auxlib文件夾下(自己新建,如果是其他名字hive重啟后會讀不到,需要每次都重新add jar)
2、進入hive,添加jar包
add jar linux_jar_path//jar包絕對路徑
3、創建函數
create [temporary] function [dbname.]function_name AS class_name; --temporary,是否創建臨時函數 --dbname. 用戶自定義的函數是以庫為單位的,在其他庫要想調用函數需要 庫名.函數名 來使用 --class_name 指的是編寫類的全類名
注意點:
當要修改jar包時,需要替換舊jar包,然后重啟Hive客戶端即可!!
二、自定義UDTF函數
代碼走起
重點:1、類要繼承org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;
2、需要重寫 initialize(),process(),close()三個方法
public class MyUDTF extends GenericUDTF { private ArrayList<String> outList = new ArrayList<>(); @Override public StructObjectInspector initialize(StructObjectInspector argOIs) throws UDFArgumentException { //1.定義輸出數據的列名和類型(固定格式) List<String> fieldNames = new ArrayList<>(); List<ObjectInspector> fieldOIs = new ArrayList<>(); //2.添加輸出數據的列名和類型 fieldNames.add("lineToWord"); //字符串的固定格式 fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector); return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs); } @Override public void process(Object[] args) throws HiveException { //1.獲取原始數據 String arg = args[0].toString(); //2.獲取數據傳入的第二個參數,此處為分隔符 String splitKey = args[1].toString(); //3.將原始數據按照傳入的分隔符進行切分 String[] fields = arg.split(splitKey); //4.遍歷切分后的結果,並寫出 for (String field : fields) { //集合為復用的,首先清空集合 outList.clear(); /** 這里也需要把結果寫進集合或數組里再輸出 */ //將每一個單詞添加至集合 outList.add(field); //將集合內容寫出 forward(outList); } } @Override public void close() throws HiveException { } }
其他步驟同上
自定義UDAF
參考鏈接 https://blog.csdn.net/weixin_38750084/article/details/82780461
