Hive基本内置函数、自定义函数以及性能优化

一、内置函数

二、自定义函数

2.1 自定义函数类型

从输入输出角度分类
标准函数一行数据中的一列或多列为输入,结果为单一值多行的零列到
聚合函数多列为输入,结果为单一值
表生成函数零个或多个输入,结果为多列或多行
从实现方式分类
内置函数见一
UDF自定义标准函数
UDAF自定义聚合函数
UDTF自定义表生成函数

2.2 自定义函数步骤

第一步:新建maven工程

第二步:添加UDF函数开发的依赖包

<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
    <!--hadoop依赖-->
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-common</artifactId>
      <version>2.6.0</version>
    </dependency>
    <!--hive依赖-->
    <dependency>
      <groupId>org.apache.hive</groupId>
      <artifactId>hive-exec</artifactId>
      <version>1.1.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.hive</groupId>
      <artifactId>hive-jdbc</artifactId>
      <version>1.1.0</version>
    </dependency>
  </dependencies>

第三步:创建类,写java代码

<注意要继承UDF类,重写evaluate方法>
实例1:小写字母转大写字母

public class TestUpper extends UDF {
    public Text evaluate(Text input){
        return new Text(input.toString().toUpperCase());
    }
}

写好之后,shift+ctrl+T 创建测试类进行测试

public class TestUpperTest {
    @Test
    public void evluate(){
        TestUpper tu = new TestUpper();
        Text text = tu.evaluate(new Text("hello"));
        System.out.println(text);
    }
}

实例2:计算时间差

@Description(
        name = "timeDiff",
        value="_FUNC_(dateStr,dateStr,diffType)-"+
                "diffType:0:date;1:hour;2:minute,3:second;"+
                "4:year;5:month"+"result:"+
                "while 0 is date_diff ..",
        extended = "select timeDiff('2021-04-06 12:00:00','2021-04-05 23:00:00,1');"+
                "result is '13 hour'."
)
public class TimeDiff extends UDF {
       public Text evaluate(Text dateStr1, Text dateStr2, IntWritable diffType) throws ParseException {
           String s1 = dateStr1.toString();
           String s2 = dateStr2.toString();
           int type = diffType.get();
           //把字符串转成date型
           SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
           Date d1 = sdf.parse(s1);
           Date d2 = sdf.parse(s2);
           long diff = Math.abs(d1.getTime() - d2.getTime());
           long result = 0;

           String dateType="";
           switch (type){
               case 0:
                   result=diff/1000/3600/24;
                   dateType="day";
                   break;
               case 1:
                   result=diff/1000/3600;
                   dateType="hour";
                   break;
               case 2:
                   result=diff/1000/60;
                   dateType="minute";
                   break;
               case 3:
                   result=diff/1000;
                   dateType="second";
                   break;
               case 4:
                   result=diff/1000/3600/24/365;
                   dateType="year";
                   break;
               case 5:
                   result=diff/1000/3600/24/30;
                   dateType="month";
                   break;

           }
           return new Text(result+dateType) ;
       }
}

写好之后,shift+ctrl+T 创建测试类进行测试

public class TimeDiffTest {
    @Test
    public void evaluate() throws ParseException {
            TimeDiff td = new TimeDiff();
            Text result = td.evaluate(new Text("2021-04-06 12:23:54"),
                    new Text("2021-04-06 10:23:54"), new IntWritable(1));
            System.out.println(result);

    }
}

第四步:测试成功之后,打jar包,上传到liunx

Maven Projects>Lifecycle>package>双击,在project栏生成target中有jar包即成功
Maven Projects>Lifecycle>clean>双击,清除jar包

第五步:添加jar包、创建函数(两种方式)

方法一:

1) add jar [jar包在linux本地的全路径]
2) hive> create function [函数名] as '全类名'

方法二:

1)hdfs dfs -put  [jar包在linux上的本地路径.jar] [hdfs上的路径]
 (2)hive> create [temporary] function uppp as '全类名' 
using jar 'hdfs:///hdfs上的路径/xxx.jar';
 (3)查看函数:desc function 函数名
 (4) 测试:
select 函数名[参数1,参数2...];
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值