目录
一、内置函数
略
二、自定义函数
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,...];