一、 系统内置函数
如果想知道一个函数的使用, 使用
desc function funName
hive> desc function upper;
OK
upper(str) - Returns str with all characters changed to uppercase
Time taken: 0.008 seconds, Fetched: 1 row(s)
hive>
1.1、数据函数
1.2、字符函数
1.3、收集函数和转换函数
1.3.1、收集函数格式:
size(map(, ));
范例:
hive> select size(map(1, 'a', 2, 'b'));
OK
2
Time taken: 0.79 seconds, Fetched: 1 row(s)
hive>
1.3.2、转换函数格式
将莫个数据按照某种格式转化
hive> select cast(1 as float);
OK
1.0
Time taken: 0.648 seconds, Fetched: 1 row(s)
hive>
1.3.3、case when
select name,
case
when age < 10 then "婴儿" //注意各个when...then 后没有逗号分隔
when age < 18 then "少年"
when age < 20 then "青少年"
when age < 30 then "青年"
when age < 40 then "中年"
else "老年" //其他条件 使用else
end as age, //end 结束, 通常使用as 设置别名
sex, province from person;
hive> select year('2017-12-15'), month('2017-12-15'), day('2017-12-15');
OK
2017 12 15
Time taken: 0.729 seconds, Fetched: 1 row(s)
hive>
1.4.3、weekofyear:一年的第几周
hive> select weekofyear('2017-12-15') ;
OK
50
Time taken: 0.624 seconds, Fetched: 1 row(s)
hive>
1.4.4、datediff: 两个日期相差多少天
hive> select datediff('2017-12-15', '2017-12-13');
OK
2
Time taken: 0.64 seconds, Fetched: 1 row(s)
hive>
hive> select datediff('2017-12-15 13:45', '2017-12-13 12:30');
OK
2
Time taken: 0.679 seconds, Fetched: 1 row(s)
hive> select datediff('2017-12-15 13:45:23', '2017-12-13 12:30:23');
OK
2
Time taken: 0.634 seconds, Fetched: 1 row(s)
hive>
1.4.4、date_add, date_sub;
日期增加函数: date_add语法: date_add(string startdate, int days)
- 返回值: string
- 说明: 返回开始日期startdate增加days天后的日期。
举例:
hive> select date_add('2012-12-08',10) from dual;
2012-12-18
日期减少函数: date_sub语法: date_sub (string startdate, int days)
- 返回值: string
- 说明: 返回开始日期startdate减少days天后的日期。
举例:
hive> select date_sub('2012-12-08',10) from dual;
2012-11-28
二、自定义函数
1)Hive 自带了一些函数,比如:max/min等,但是数量有限,自己可以通过自定义UDF来方便的扩展。 2)当Hive提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义函数(UDF:user-defined function)。 3)根据用户自定义函数类别分为以下三种:
-
(1)UDF(User-Defined-Function)
- 一进一出
-
(2)UDAF(User-Defined Aggregation Function)
- 聚集函数,多进一出
- 类似于:count/max/min
-
(3)UDTF(User-Defined Table-Generating Functions)
- 一进多出
- 如lateral view explore() 4)官方文档地址: https://cwiki.apache.org/confluence/display/Hive/HivePlugins
5)编程步骤:
- (1)继承org.apache.hadoop.hive.ql.UDF
- (2)需要实现evaluate函数;evaluate函数支持重载;
- (3)在hive的命令行窗口创建函数
- a)添加jar
- add jar linux_jar_path
- b)创建function,
- create [temporary] function [dbname.]function_name AS class_name;
- a)添加jar
- (4)在hive的命令行窗口删除函数
- Drop [temporary] function [if exists] [dbname.]function_name;
6)注意事项
- (1)UDF必须要有返回类型,可以返回null,但是返回类型不能为void;
1.创建一个Maven工程Hive
2.导入依赖
org.apache.hive
hive-exec
2.1.1
3.创建一个类
package com.chb.hive.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
public class Lower extends UDF {
public String evaluate (final String s) {
if (s == null) {
return null;
}
return s.toLowerCase();
}
}
4.打成jar包上传到服务器/uardata1/hivetest/udf.jar
5.将jar包添加到hive的classpath
hive (default)> add jar /uardata1/hivetest/udf.jar
6.创建临时函数与开发好的java class关联
hive (default)> create temporary function mylower as "com.chb.hive.udf.Lower";
7.即可在hql中使用自定义的函数strip
hive (default)> select ename, mylower(ename) lowername from emp;
2.2、自定义UDTF
继承自GnericUDTF
,重写3个方法:
- initialize(自定义输出的列名和类型)
- process(将结果返回forward(result))
- close