Hive(四)--hive内置函数、自定义函数UDF

Hive函数

分类:
①从输入输出角度分类

  • 标准函数:一行数据中的一列或多列为输入,结果为单一值
  • 聚合函数:多行的零列到多列为输入,结果为单一值
  • 表生成函数:零个或多个输入,结果为多列或多行

②从实现方式分类

  • 内置函数
  • 自定义函数
内置函数

Hive提供大量内置函数供开发者使用:
①标准函数

  • 字符函数
    在这里插入图片描述
-- concat:字符拼接
select concat('abc','def','g');
输出:abcdefg
-- instr:查找字符串中子串位置,返回第一个字符的位置,若没找到则返回0
select instr('abca','bca');
输出:2
-- length:返回字符串长度
select length('acbdef');
输出:6
-- lower/upper 将字母转成小写/大写
select lower('aBCD');
输出:abcd
select upper('Abcd');
输出:ABCD
-- split:以指定的正则分割字符串
select split('a|b|c|d','\\|'); 
注:|在正则中有实际意义,故需要用\\转义
输出:["a","b","c","d"]
-- substr/substring:字符串截取,起始下标可以是0和1,只给定一个参数默认截取到末尾
select substring('abcdef',0,3);
输出:abc
select substring('abcdef',1,3);
输出:abc
select substring('abcdef',1);
输出:abcdef
-- trim:消除两端空格,中间的空格不消除
select trim(' a ab cd ');
输出:a ab cd
-- 
-- 将字符串A中的符合java正则表达式B的部分替换为C
select regexp_replace('foobar', 'oo|ar', '') from tableName; //输出fb
-- 查找指定位置后的某个字符
select locate('a','abcd'), locate('b', 'abcd'), locate('f', 'abcd')//输出1  2  0
-- str_to_map(字符串参数, 分隔符1, 分隔符2),使用两个分隔符将文本拆分为键值对
-- 分隔符1将文本分成K-V对,分隔符2分割每个K-V对,对于分隔符1默认分隔符是 ',',对于分隔符2默认分隔符是 '='select str_to_map('aaa:11&bbb:22', '&', ':') from tableName // 输出{"bbb":"22","aaa":"11"}

  • 类型转换函数
    在这里插入图片描述
-- cast
select cast('10' as int)+1;
输出:11
-- binary

  • 数学函数
    在这里插入图片描述
-- round:对数值进行四舍五入,第二参数为小数位数,默认为1位
select round(5.2155);
输出:5.0
select round(5.2155,2);
输出:5.22
--floor:向下取整,即小于该数的最大整数
select floor(5.6);
输出:5
-- rand:返回一个随机整数,seed为种子,种子相同产生的随机数相同,该参数可省略
select rand();
select rand(5);
-- power:计算一个数的幂次方
select power(2,3);
输出:8.0
-- abs:计算绝对值
select abs(-11);
输出:11
  • 日期函数
    在这里插入图片描述
-- from_unixtime
select from_unixtime(1601100043,'yyyy-MM-dd');
输出:2020-09-26
-- unix_timestamp
select unix_timestamp();
输出:1601099605
select unix_timestamp('2020-09-26 13:51:20');
输出:1601099480
-- to_date
select to_date('2020-09-26 13:34:12');
输出:2020-09-26
-- year
select year('2020-09-26 13:51:20');
输出:2020
-- month
select month('2020-09-26 13:51:20');
输出:9
-- datediff
select datediff('2020-10-01','2020-09-26');
输出:5
select datediff('2020-09-26','2020-10-01');
输出:-5
-- date_add
select date_add('2020-09-26',5);
输出:2020-10-01
select date_add('2020-10-01',-5);
输出:2020-09-26
-- date_sub
select date_sub('2020-09-26',-5);
输出:2020-10-01
select date_sub('2020-10-01',5);
输出:2020-09-26
-- current_date
select current_date();
输出:2020-09-26
  • 集合函数
    在这里插入图片描述
  • 条件函数
    在这里插入图片描述
-- if(condition,true,false)语句
select if(1>2,0,1),if(1<2,0,1);
输出:1 0
-- nvl(v1,v2):若v1为null则返回v2,否则返回v1
select nvl(null,1),nvl(2,3);
输出:1 2
-- coalesce:返回第一非null的值,若全部为null,则返回null
select coalesce(null,1,null,2,3),coalesce(null,null,null);
输出:1 NULL
-- case when
select case when 1>2 then 0 else 1 end,case when 1<2 then 0 else 1 end;
输出:1 0

②聚合函数
聚合函数与mysql的使用方法类型,包括不仅限于count()、sum()、max()、min()、avg()
③表生成函数
在这里插入图片描述

-- explode
select explode(array(1,2,3,4)
输出结果:1
		2
		3 
		4
select explode(map(1,2,3,4));
输出结果:1	2
		3	4
-- posexplode:返回数组中元素下表和元素
select posexplode(array(1,2,3,4));
输出:0       1
    1       2
    2       3
    3       4
-- stack:列转行,第一个参数为行数,每行个数为列数/行数
select stack(2,'a','b','c','d','e','f');
输出:a       b       c
	 d       e       f
自定义函数UDF

UDF的全称为user-defined function,使用java实现自定义函数需要继承UDF类,重写evaluate()方法
步骤为:

  • 新建maven项目
  • 配置依赖
<dependency>
  <groupId>org.apache.hadoop</groupId>
  <artifactId>hadoop-common</artifactId>
  <version>2.6.0</version>
</dependency>
<dependency>
  <groupId>org.apache.hive</groupId>
  <artifactId>hive-exec</artifactId>
  <version>1.2.1</version>
</dependency>
  • 创建一个类继承UDF,重写evevaluate()方法
// 自定义一个打印三角形的函数
public class Triangle extends UDF {
    StringBuffer sb = new StringBuffer();
    public Text evaluate(Integer num){
        int n = num;
        for (int i = 1; i <= n; i++) {
            for(int j=i;j<=n-1;j++){
                sb.append(" ");
            }
            for(int j=1;j<=i;j++){
                sb.append("* ");
            }
            sb.append("\n");
        }
        return new Text(sb.toString());
    }
}
  • 将程序打成jar
    File–>Project Structure->artifacts
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    等待maven将jar包打好,在out中可以找打jar包
    在这里插入图片描述
  • 将jar包上传到linux
    在这里插入图片描述
  • 为防止出错,先在linux中执行下述命令
    zip -d /opt/testudf.jar 'META-INF/.SF' 'META-INF/.RSA' 'META-INF/*SF'
    在这里插入图片描述

其中/opt/testudf.jar为jar包所在路径

  • 调用函数分为临时和永久
    ①临时函数
    进入hive命令行执行:
    add jar /opt/testudf.jar;
    create temporary function triangle as 'com.udf.Triangle';
    select triangle(5)';
    第一句中/opt/testudf.jar为linux中的jar包放置路径
    第二句中的demo1位函数名称,com.udf.Triangle为类路径
    第三句为调用函数
    在这里插入图片描述
    ②永久函数
    上传jar包到hdfs:hdfs dfs -put /opt/testudf3.jar /apps/hive/functions
    创建函数:create function triangle2 as 'cn.udf.Triangle' using jar 'hdfs://192.168.233.133:9000/apps/hive/functions/testudf3.jar';
    使用函数:select triangle2(6);
    在这里插入图片描述
    注意:临时函数只在当前会话中有用,且能够跨库使用;永久函数不能跨库使用,只能在创建的库中使用
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值