大数据生态系统之-Hive 函数
学习目标
- 了解Hive内置运算符和内置函数
- 记忆Hive自定义函数的使用方法
1-Hive内置运算符和内置函数
- 1.1在 Hive 有四种类型的运算符:
-
关系运算符
-
算术运算符
-
逻辑运算符
-
复杂运算
-
- 1.2内置函数
- 简单函数: 日期函数 字符串函数 类型转换
- 统计函数:sum avg distinct
- 集合函数:size array_contains
- show functions 显示所有函数;
- desc function 函数名;
- desc function extended 函数名;
2- Hive 自定义函数
-
UDF 和UDAF
- UDF: 用户自定义函数(user-defined function)
- UDAF: 用户自定义聚合函数 (user-defined aggregation function)
- 当 Hive 提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用UDF(或UDAF)
- UDF相当于mapper,对每一条输入数据,映射为一条输出数据。
- UDAF相当于reducer,做聚合操作,把一组输入数据映射为一条(或多条)输出数据。
-
一个脚本至于是做mapper还是做reducer,又或者是做UDF还是做UDAF,取决于我们把它放在什么样的hive操作符中。放在select中的基本就是UDF,放在distribute by和cluster by中的就是UDAF。
-
UDF示例(运行java已经编写好的UDF)
- 在hdfs中创建 /user/hive/lib目录
hadoop fs -mkdir /user/hive/lib
- 把 hive目录下 lib/hive-contrib-2.3.4.jar 放到hdfs中
hadoop fs -put hive-contrib-2.3.4.jar /user/hive/lib/
- 把集群中jar包的位置添加到hive中
hive> add jar hdfs:///user/hive/lib/hive-contrib-2.3.4.jar ;
- 在hive中创建临时UDF
hive> CREATE TEMPORARY FUNCTION row_sequence as 'org.apache.hadoop.hive.contrib.udf.UDFRowSequence'
- 在之前的案例中使用临时自定义函数(函数功能: 添加自增长的行号)
Select row_sequence(),* from employee;
- 创建非临时自定义函数
CREATE FUNCTION row_sequence as 'org.apache.hadoop.hive.contrib.udf.UDFRowSequence'
using jar 'hdfs:///user/hive/lib/hive-contrib-2.3.4.jar';
2.2Python UDF
- 准备案例环境
- 创建表
CREATE table u(fname STRING,lname STRING);
- 向表中插入数据
insert into table u2 values('George','washington');
insert into table u2 values('George','bush');
insert into table u2 values('Bill','clinton');
insert into table u2 values('Bill','gates');
- 编写map风格脚本
import sys
for line in sys.stdin:
line = line.strip()
fname , lname = line.split('\t')
l_name = lname.upper()
print '\t'.join([fname, str(l_name)])
- 通过hdfs向hive中ADD file
- 加载文件到hdfs
hadoop fs -put udf.py /user/hive/lib/
- hive从hdfs中加载python脚本
ADD FILE hdfs:///user/hive/lib/udf.py;
ADD FILE /root/tmp/udf1.py;
- Transform
SELECT TRANSFORM(fname, lname) USING 'python udf1.py' AS (fname, l_name) FROM u;
2.3java自定义函数
1)根据用户自定义函数类别分为以下三种:
(1)UDF(User-Defined-Function)
一进一出
(2)UDAF(User-Defined Aggregation Function)
聚集函数,多进一出
类似于:count/max/min
(3)UDTF(User-Defined Table-Generating Functions)
一进多出
如lateral view explore()
2)官方文档地址
https://cwiki.apache.org/confluence/display/Hive/HivePlugins
3)编程步骤:
(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;
(4)在hive的命令行窗口删除函数
Drop [temporary] function [if exists] [dbname.]function_name;
6)注意事项
(1)UDF必须要有返回类型,可以返回null,但是返回类型不能为void;
7.3 自定义UDF函数
1.创建一个Maven工程Hive
2.导入依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.hive/hive-exec -->
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>1.2.1</version>
</dependency>
</dependencies>
3.创建一个类
package com.wyh.hive;
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包上传到服务器/opt/module/jars/udf.jar
5.将jar包添加到hive的classpath
hive (default)> add jar /opt/module/datas/udf.jar;
6.创建临时函数与开发好的java class关联
hive (default)> create temporary function mylower as "com.wyh.hive.Lower";
7.即可在hql中使用自定义的函数strip
hive (default)> select ename, mylower(ename) lowername from emp;
3-总结
- Hive内置运算符和内置函数
- Hive自定义函数
- 清楚UDF和UDAF的区别:mapper 和 reducer
- 使用别人编写好的UDF(UDAF)
- 使用python脚本实现UDF(UDAF)