Hive数据仓库
1.什么是Hive
Hive是基于Hadoop的一个数据仓库工具,主要是用于离线分析,它可以将结构化的数据文件映射成一张数据库表,并提供类SQL查询的功能。
2.使用Hive带来的好处
- 直接使用Hadoop人员学习成本太高,学习周期长
- 一般项目的周期太短,直接使用Hadoop底层开发过于复杂,很难在项目周期内完成。
- 降低了数据处理的便捷性与门槛,传统的Mapreduce对开发人员要求高,掌握的技能复杂,而Hive使用类SQL,使传统数据库开发人员能在短期内上手。
3.Hive的安装与配置
有关Hive的安装与配置,请参考另外一篇文章:
Spark大数据系列:二十五、详解Hive的安装与配置
4.Hive的使用
- 4.1.交互式访问
在Hive的客户端启动hive(已经配置好了Hive的环境变量), 即可进入Hive的交互模式:
[hadoop@node03 ~]$ hive
小技巧:
1.在交互式窗口中显示当前数据库(也可以配置在hive-site.xml中使其永久生效)
hive>set hive.cli.print.current.db=true
2.设置查询结果显示列头
hive>set hive.cli.print.header=true
如果你使用的是linux, 也可以在用户主目录下编辑|新建.hiverc文件,将下面的参数存入该文件中:
cd ~vi .hiverc# 添加下面记录set hive.cli.print.header=true;set hive.cli.print.current.db=true;
- 4.2.启动HiveServer2服务远程访问
[hadoop@node01 ~]$ $HIVE_HOME/bin/hiveserver2 1>/dev/null 2>&1
然后通过beeline访问:
beeline>!connect jdbc:hive2://node01:10000
5.Hive创建数据库
hive> create database mydb;OKTime taken: 0.294 secondshive> show databases;OKdefaultmydb
在MySQL元数据库中就生成了对应的记录,如下图所示:
MySQL元数据
查看HDFS的WebUI, 也可以看出在HDFS相应目录下生成了文件:
HDFS WEBUI
6.建表
- 6.1.基本创建表语句
# 1.使用上面创建的数据库hive> use mydb;OKTime taken: 0.195 seconds# 2.创建一张表, 默认创建的是内部表(managed table)hive> create table t_order(id string, creation_time string, amount float, user_id string) row format delimited fields terminated by ',';OKTime taken: 0.93 secondshive> show tables;OKt_orderTime taken: 0.098 seconds, Fetched: 1 row(s)# 3.删除表使用hive> drop table t_order;
- 6.2.内部表和外部表
- 内部表(Managed Table)
内部表(managed table): 表目录按照Hive的规划来部署,位于Hive的配置文件中指定的目录/user/hive/warehosue中。
- 外部表(External Table)
外部表(external table): 表目录由建表用户自己指定。相对于内部表,数据不在自己的数据仓库中,只保存数据的源信息
# 创建外部表create external table t_logs(ip string, url string, action_time string)row format delimitedfields terminated by ','location '/user/hadoop/logs/access.log';
- 6.3.内部表和外部表的区别
- 内部表的目录在hive的仓库目录中,外部表的目录由用户指定;
- drop一个内部表时,hive会清除相关元数据,并删除表数据目录;
- drop一个外部表时,hive只会清除相关元数据;
基于Hive的数据仓库,最底层的表,一定是来自外部系统,为了不影响外部系统的工作逻辑,在Hive中创建external表来映射这些外部系统产生的数据目录,然后后续的ETL操作,产生的各种表建议用内部表managed_table来管理。
7.创建分区表
分区表的实质是:在表目录中为数据文件创建分区子目录,以便于在查询时,MR程序可以针对分区子目录中的数据进行处理,缩减读数据的范围。
比如,网站每天产生的浏览记录,浏览记录应该建一个表来存放,但是,有的时候,我们可能只需要对某一天的浏览记录进行分析,这时,就可以将这个表建为分区表,每天的数据导入其中的一个分区。
当然,每日的分区目录,应该有一个目录名(分区字段)
# 创建分区表hive> create table t_application_pv(ip string, url string, action_time string)partitioned by (day string)row format delimitedfields terminated by ',';# 向分区表中导入本地数据(不加local表示hdfs路)hive> load data local inpath '/home/hadoop/pv_log.20200520' into table t_application_pv partition(day='2020-05-20');# 针对分区进行查询hive> select count(*) from t_application_pv where day='2020-05-20'; # 多个分区字段hive> create table t_employee(id int, name string, age int) partitioned by(department string, gender string) row format delimited fields terminated by ',';# 导入本地数据hive> load data local inpath '/home/hadoop/employee.csv' overwriteinto table t_employee(department='销售', gender='男');
8.CTAS建表语法
CTAS语法是通过已有的表来创建新表
# 创建与表t_employee结构一样的表, 只是复制表结构,不包含数据hive> create table t_employee_alias like t_employee;# 通过t_employee表创建表,包含数据hive> create table t_employee_info as select id, name from t_employee;
9.Hive中数据的导入
- 9.1.手动用hdfs命令移动文件
使用hive的HQL建表语句创建好表,然后将文件通过hdfs命令的方式移动到hive数据仓库的目录下。
- 9.2.在hive的交互窗口shell中用hive命令导入本地的数据至Hive表的目录中
hive> load data local inpath '/home/hadoop/order.csv' overwrite into table t_order;
- 9.3.用hive命令导入hdfs中数据文件到表目录(文件会发生移动)
hive> load data inpath '/user/hadoop/order.csv' overwrite into table t_order;