HIVE自定义函数的实现

HIVE中的函数分类

UDF(一进一出)

UDAF (多进一出)(count/max/min)聚合函数

UDTF(一进多出)视图

自定义函数写法

创建一个Maven工程后导入依赖

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

可以在
pom.xml 的build 中添加 finalName
此时package的包名就是finalName

<build>
<finalName>fun</finalName>
</build>

UDF

import org.apache.hadoop.hive.ql.exec.UDF;

/**
 * @ues          将输入字符串首字母大写函数代码
 */
public class InitUpper extends UDF {
    public String evaluate(final String txt){
        return txt.substring(0,1).toUpperCase()+txt.substring(1);
    }
}

UDTF

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;

/**
 * @ues    数据进入时是一个array输出时为一个表
 */
public class splitMap extends GenericUDTF {

    //产生语句翻译后的表结构
    @Override
    public StructObjectInspector initialize(ObjectInspector[] argOIs) throws UDFArgumentException {
        ArrayList<String> colums=new ArrayList<String>();
        ArrayList<ObjectInspector> colType =new ArrayList<ObjectInspector>();
        //第一列字段名
        colums.add("col1");
        //第一列结构类型
        colType.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
        colums.add("col2");
        colType.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
        return ObjectInspectorFactory.getStandardStructObjectInspector(colums,colType);
    }

    //处理方法
    @Override
    public void process(Object[] objects) throws HiveException {
        //例如:获得['name:zx','age:50']
        String[] datas = objects[0].toString().split(",");
        String[] res=new String[2];
        //将张三放到数组第一个
        res[0]=datas[0].split(":")[1];
        res[1]=datas[1].split(":")[1];
        //将数据塞入表
        forward(res);
    }

    @Override
    public void close() throws HiveException {

    }
}

UDAF

在写UDAF函数时 方法名不可变

import org.apache.hadoop.hive.ql.exec.UDAF;
import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;

/**
 * @ues       将字符串连成一行    多进一出   依靠内部类加工
 */

public class LinkStr extends UDAF {

    private static String result="";

    public static class cmLink implements UDAFEvaluator{

        @Override
        public void init() {
        }

        //聚合  作为mapper一部分  也做reduce的事
        public boolean iterate(String name){
            result=result.concat(name);
            return true;
        }

        //combiner  分割方法
        public String terminatePartial(){
            return result;
        }

        // 相当于partition
        // 多行数据分开 交个iterate
        public boolean merge(String name){
            return iterate(name);
        }

        //reduce 可以不用干
        public String terminate(){
            return result;
        }
    }
}

在hive中添加函数

1.将代码打瘦包 package

2.将jar包传到linux中

3.在hive中add jar包

add jar /opt/fun.jar 

4.添加函数

在IDEA中Ctrl+Alt+Shift+c四键复制类的全类名

        临时函数          方法名      类名(程序入口)  
create temporary function iu as 'cn.kgc.udf.InitUpper';
删除函数
drop temporary function iu

5.测试
达到了首字母大写的效果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值