Hive学习之———自定义函数

正常在我们hive中是由很多的函数的,有的我们可以直接用,但是但我们去计算复杂数据时,我们就要去写一些规则来将数据筛选出来,这里我使用的是idea开发环境来开发的。
1.UDF
自定义函数分为三种
一、UDF一对一
UDF是继承hive中UDF而实现evaluate方法,它是一对一的关系,UDF操作作用于单个数据行,并且产生一个数据行作为输出。大多数函数都属于这一类(比如数学函数和字符串函数)。
二、UDAF多对一
UDAF是继承hive中UDAF,它提供一个实现了UDAFEvaluator接口的内部类,提供一个实现了UDAFEvaluator接口的内部类,它适用于最大值
三、UDTF一对多
UDTF是继承GenericUDTF,UDTF 操作作用于单个数据行,并且产生多个数据行
这里我们只需要看UDF即可,其他的两种基本已经被淘汰
我们可以通过书写jdbc进行对hive连接,我们就不需要进入hive就可以操作hive了
private static String driverName = “org.apache.hive.jdbc.HiveDriver”;

public static void main(String[] args) throws SQLException {
    try {
        // 加载驱动信息
        Class.forName(driverName);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
        System.exit(1);
    }
    // 建立连接
    Connection con = DriverManager.getConnection(
            "jdbc:hive2://192.168.32.188:10000/test", "root", "root");
    Statement stmt = con.createStatement();
注:这里一定要根据自己的集群去创建自己的连接
    String tableName = "jdbcTest2";
    stmt.execute("drop table if exists" + tableName);
    stmt.execute("create table " + tableName + "(key int, value string)");
    System.out.println("Create table success!");

    // show tables
    String sql = "show tables'" + tableName + "'";
    System.out.println("Running: "+ sql);
    ResultSet res = stmt.executeQuery(sql);
    if(res.next()){
        System.out.println(res.getString(1));
    }

    // describe table
    sql = "describe " + tableName;
    System.out.println("Running " + sql);
    res = stmt.executeQuery(sql);
    while (res.next()){
        System.out.println(res.getString(1) + "\t" + res.getString(2));
    }

    sql = "select * from " + tableName;
    res = stmt.executeQuery(sql);
    while(res.next()){
        System.out.println(String.valueOf(res.getInt(1)) + "\t" +res.getString(2));
    }

    sql = "select count(1) from " + tableName;
    System.out.println("Running " + sql);
    res = stmt.executeQuery(sql);
    while(res.next()){
        System.out.println(res.getString(1));
    }
}

现在我们就可以编写自定义UDF函数了
public class TestUdf extends UDF {

public  String evaluate(String input) {
    if (input == null) {
        return null;
    }
    return input.toLowerCase();
}

}
这里我实现的是表中字母变小写,在这里input中有许多方法,大家可以自己去编写

2.UDF与集群的结合
我们创建完自定义函数之后怎么去使用呢?
2-1、首先我们找到idea右侧Maven project,点开之后先点击clean,等控制台提示成功后在点击package,进行打包
在这里插入图片描述2-2、在右侧target下我么可以找到生成的jar包
在这里插入图片描述
2-3、接下来我们需要将jar包导入hive中
启动hive后执行add jar /opt/software/jars/UDF.jar;

在这里插入图片描述
这样我们就将这个jar包导入到hive中了
2-4、接下来我们创建自定义函数

create function 函数名 as “这里写你在idea创建UDF时的包路径比如:com.baidu.test.TestUdf”;
这样我们对于表中的数据进行自定义函数的函数我们已经创建好了
在这里注意一点,我们普通创建的函数在查看函数时show functions;是不显示的,如果你想再次使用这个函数时,是会失败的。如果想让这个函数显示就可以在创建时加入TEMPORARY,就可以在show functions;中查看到创建的函数了。

2-5、我们需要准备一个符合规则的表,表中要有数据
接下来我们需要输入 select 字段名,函数名(字段名) from 表名;
这样我们就会查询到对应的数据的函数格式。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值