准备工作,创建工程,添加jar
<dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>1.2.1</version> </dependency>
一、udf函数
1.编写自定义函数。
①继承UDF,添加evaluate方法,虽然不是实现也不是重写,但是方法名必须叫evaluate。
②此evaluate方法可以重载。
public class MyUDF extends UDF { public int evaluate(int data){ return data + 5; } }
2.打包,上传到服务器,hive的lib目录下。
3.将jar包添加到hive的classpath。
hive (default)> add jar /opt/module/hive/lib/hive-udf-1.0-SNAPSHOT.jar;
4.创建(临时)函数与java类关联。生产环境要指定函数所在的库名。
语法:create [temporary] function [dbname.]function_name AS class_name;
hive (default)> create temporary function addFive as "com.atguigu.udf.MyUDF";
5.使用自定义函数。
hive (default)> select addFive(2); OK _c0 7
二、udtf函数
编写自定义函数,其他步骤与上同。
public class MyUDTF extends GenericUDTF { private List<String> dataList = new ArrayList<>(); @Override public StructObjectInspector initialize(StructObjectInspector argOIs) throws UDFArgumentException { //1.自定义列名集合 List<String> fieldNames = new ArrayList<>(); fieldNames.add("lineToWord"); //2.输出数据的类型 List<ObjectInspector> fieldOIs = new ArrayList<>(); fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector); return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs); } //函数的参数被封装为一个数组 @Override public void process(Object[] objects) throws HiveException { //获取数据 String data = objects[0].toString(); //获取分隔符 String splitKey = objects[1].toString(); //切分数据 String[] words = data.split(splitKey); //遍历写出 for (String word : words) { dataList.clear(); dataList.add(word); forward(dataList); } } @Override public void close() throws HiveException { } }