大数据生态系统之-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)