Hive专栏 | ||
---|---|---|
上一篇 | 主目录 | 下一篇 |
【前言】
1 内置函数
1.1 查看内置函数
show functions; //查看
desc function abs; //显示函数的详细信息:
desc function extended concat; //显示函数的扩展信息:
https://blog.csdn.net/liu123641191/article/details/80845411
https://blog.csdn.net/TheRa1nMan/article/details/89408718
1.2 使用内置函数解析json数据
可以使用命令desc function extended get_json_object;
来查看内置函数的使用方式:
rating.json文件(一百万条记录/行)中的数据格式为(每行):{"movie":"1193","rate":"5","timeStamp":"978300760","uid":"1"}
- 创建表来加载rating.json文件:
先加载rating.json文件到hive的一个原始表
hive> create table json_table(json_line string);//因为是读取一行作为表中的一个字段,不需要指定field terminated
hive> load data local inpath "/home/hadoop/rating.json" overwrite into table json_table;
hive> select * from json_table limit 10;
- 用get_json_object函数解析json_table的数据
//创建rating这张表用来存储解析json得到的字段
hive> create table rating(movie int,rate int,time_stamp bigint,uid int) row format delimited fields terminated by ",";
//解析json,得到结果之后存入rating表
hive> insert into table rating select
> get_json_object(json_line,'$.movie') as movie,
> get_json_object(json_line,'$.rate') as rate,
> get_json_object(json_line,'$.timeStamp') as time_stamp,
> get_json_object(json_line,'$.uid') as uid
> from json_table;
结果:
2 自定义函数
当 Hive 提供的内置函数无法满足业务处理需要时,此时就可以考虑使用用户自定义函数
2.1 分类
- UDF(user-defined function)作用于单个数据行,产生一个数据行作为输出。(数学函数,字符串函数)
- UDAF(用户定义聚集函数 User- Defined Aggregation Funcation):接收多个输入数据行,并产生一个输出数据行。(count,max)
- UDTF(表格生成函数 User-Defined Table Functions):接收一行输入,输出多行(explode)
2.2 UDF实例
编写一个类继承UDF,重载evaluate方法,将类打成jar包上传到服务器,将jar包添加到hive的classpath,通过hive语法创建一个函数来对应这个jar,然后hive就可以使用了
编写UDF :
- 搭建hive的开发环境
在Linux服务器上安装Hive - 准备hive的java项目, IDEA创建Maven项目引入依赖(eclipse引入hive的jar包)
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>2.3.2</version>
</dependency>
- 编写一个自定义的类,extends UDF,要在该自定义类中去定义多个重载的名叫 evaluate的方法。方法名只能是evaluate,可以有多个重载方法
package com.shane.hive;
import org.apache.hadoop.hive.ql.exec.UDF;
public class MyUDF extends UDF {
public int evaluate(int a, int b){
return a*a+b*b;
}
public int evaluate(int a, int b, int c){
return a*a+b*b+c*c;
}
}
- 怎么让hive去使用?
首先要把当前定义的这个hive函数的类达成jar包,然后加入到当前会话的classpath中
IDEA右部小窗口->Maven Projects->Lifecycle->package:
将Xftp把文件上传到hadoop05服务器:
hive >add jar /home/hadoop/Hadoop_HDFS-1.0-SNAPSHOT.jar
- 注:过该方式添加的jar文件只存在于当前会话中,当会话关闭后不能够继续使用该jar文件,最常见的问题是创建了永久函数到metastore中,再次使用该函数时却提示ClassNotFoundException。更多:hive引入jar包
- 通过hive的语法来创建一个临时函数,对应到当前加入classpath中的那个jar中的对应的用户自定义类。
hive> create temporary function squaresum as 'com.shane.hive.MyUDF';
hive> select squaresum(2,3);
hive> select squaresum(2,3,4);