数据仓库Hive入门
一、什么是数据仓库
数据仓库(Data Warehouse,DW),是一种用于存储、分析和报告的数据系统,其目的是构建面向分析的集成化数据环境,其本身不产生数据,也不消费数据。
- 面向主题,是高层次上数据综合归类的地方;
- 集成性,是多个数据源统一综合的地方;
- 非易变性,会保留相当长时间的历史数据,这些数据会提供大量的查询操作,但极少会修改和删除它们;
- 时变性,数据会随着时间变化而更新,以满足变化的需求场景;
二、什么是Hive
Hive是建立在Hadoop之上的开源数据仓库系统,可以将存储在HDFS中的结构化、半结构化数据文件映射为一张数据库表,并基于表提供一种类SQL查询模型(HQL),用于用户访问和分析存储在HDFS中的大型数据集。其本质就是将HQL转换为MapReduce程序,然后提交给Hadoop集群执行。
三、为什么要使用Hive
不适用Hive也是可以的,但是会面临如下的问题:
- 数据分析人员直接编写MapReduce成本较高,需要掌握Java语言;
- 开发MapReduce来实现复杂查询逻辑比较困难;
而使用Hive的好处则是:
- 接口操作采用了HQL,一款类似SQL的查询语法,上手难度低,开发效率高;
- 避免了直接编写MapReduce程序,减少了学习成本;
- 支持自定义函数,扩展功能也很方便;
- 依靠Hadoop,天然擅长存储和分析海量的数据集;
所以Hive的最大优势就是可以让用户专注于编写HQL,而无需操心Hadoop底层的存储和计算过程,大大解放了用户的时间和脑力。
四、Hive是如何工作的
Hive主要包含如下几部分的组件:
- 用户接口,其中CLI是命令行接口,Web Interface允许浏览器访问Hive,Thrift Server则是允许外部客户端通过JDBC/ODBC的协议和Hive进行交互;
- 元数据存储,即描述数据的数据,主要是表的名字、表的列信息、表的属性、映射的文件信息等都存放再关系型数据库中,比如MySQL和Derby;
- 驱动程序,主要包含解析器、编译器、优化器、执行器等,将HQL转换为可以在计算框架上执行的代码;
- 执行引擎,也就是计算框架,比如支持的MR、Tez、Spark等;
五、如何使用Hive
在使用Hive之前,我们需要拥有一个健康运行的Hadoop集群,然后在其上安装MySQL和Hive,这部分内容网上有很多教程,此处不做赘述了。
和关系型数据库一样,Hive拥有CLI命令行客户端,但是一般开发人员不会这么使用,都有更好的图形化工具使用,比如DataGrip、Dbeaver等,更加友好也能大大提升HQL编写的效率。
5.1 DDL语句
一、建表
-- 创建数据库,对应HDFS存储路径为/user/hive/warehouse/zhangxun.db
create database if not exists zhangxun comment "zhangxun test database";
-- 切换数据库
use zhangxun;
-- 创建数据表,对应HDFS存储路径为/user/hive/warehouse/zhangxun.db/t_user_info
create table t_user_info(
id int comment "ID",
name string comment "用户姓名",
gender int comment "性别:0-男,1-女",
age int comment "年龄"
) comment "用户信息表"
-- 指定文件中字段之间的分隔符
row format delimited fields terminated by ",";
-- 导入数据操作(在hadoop集群的命令行里面操作上传)
-- hadoop fs -put user-info.txt /user/hive/warehouse/zhangxun.db/t_user_info
-- 查询数据
select * from t_user_info;
如下是自己准备的用户信息文件user-info.txt
1,张三,0,22
2,lisa,1,21
3,jerry,0,28
4,jack,0,32
5,micky,1,29
二、导数
如上导入数据我们是使用的hdfs命令,Hive不推荐我们这么做,使用Hive的Load命令也可以实现数据的导入:
-- 创建数据表,对应HDFS存储路径为/user/hive/warehouse/zhangxun.db/t_car_info
create table t_car_info(
id int comment "ID",
brand string comment "汽车品牌",
year int comment "年份"
) comment "汽车信息表"
row format delimited fields terminated by ",";
-- 从HiveServer2所安装的服务器的路径上传到HDFS的/user/hive/warehouse/zhangxun.db/t_car_info下面
load data local inpath '/root/data/car-info.txt' into table t_car_info;
-- 查询数据
select * from t_car_info;
5.2 DML语句
一、插入数据
在上面我们提到Hive作为数据仓库具有“非易变性”,也就是说通常很少有场景会要去对已存的数据进行修改和插入,所以通常插入数据的场景多见于数据清洗和转换的需要。比如:
- 原始表中的数据字段非常多,我们用于分析的数据并需要这么多无关的字段;
- 原始表中存在脏数据,在分析前需要将这些脏数据进行过滤;
- 原始表中存在非原子列或者不是理想的字段格式,需要在分析前将其拆分和转换;
- 等等其它场景;
我们使用:
-- 先创建目标表
create table t_target_user(id int,age int);
-- 将原始表中的数据清洗后存入目标表(假设没有name值的用户信息是无效的)
insert into table t_target_user select id,age from t_user_info where name is not null;
或者更简单的:
-- 无需提前创建目标表
create table t_target_user as select id,age from t_user_info where name is not null;
二、查询数据
- select_expr,查询表达式,可以是字段、函数;
- all/distinct,用于指定查询结果中重复的行如何处理;
- where,过滤条件;
- 聚合函数操作,比如count、sum、max、min、avg等函数,特点是不管原始数据有多少行,输出结果只有一条,就是聚合的结果;
- group by,和聚合函数结合使用,根据一个或者多个列,对它们的内容进行分组聚合;
- having,和group by结合使用,基于group by的结果进行过滤,并且支持使用聚合函数作为过滤条件;
- order by,按照指定的列对结果集进行排序;
- limit,限制查询返回的行数;
三、关联数据
- inner join,也就是join,两个表中都存在与连接条件相匹配的数据才会被留下来;
- left outer join,也就是left join,以左表的全部数据为准,右表与之关联上的才会被保留下来;
四、常用函数
-- 查看所有可用的函数
show functions;
-- 查看某个具体函数的使用方法
describe funciton extended funciton_name;
- 数值类型函数
- 日期类型函数
- 字符串类型函数
- 集合函数
- 条件函数
- 等等其它
五、自定义函数
- UDF,User Defined Function,普通函数,一个输入一个输出;
- UDAF,User Defined Aggregation Function,聚合函数,多个输入一个输出;
- UDTF,User Defined Table-Generating Function,表生成函数,一个输入多个输出;
更多关于函数的内容可以参考LanguageManual UDF - Apache Hive - Apache Software Foundation
总结下来,大体的使用方式和SQL语法一致,更多内容可以参考Home - Apache Hive - Apache Software Foundation