Day06_01_Hive数据仓库
Day06_01_Hive数据仓库
SmithHive数据仓库
一、概述
1、Hive是Hadoop的子项目,后来被独立出来成为了一个Apache的顶级项目
2、Hive是Apache提供的一套基于Hadoop的进行数据仓库管理的工具,提供了读写以及管理海量数据的功能
3、Hive提供了大量的类SQL(Hive QL,简称为HQL)来对Hadoop(HDFS)上的数据进行操作,底层会将HQL语句转
换为MapReduce程序执行,所以适合离线开发
4、Hive可以管理HDFS上的数据,使用表结构的形式来管理HDFS上的数据
5、默认情况下,Hive的元数据信息不是存储在HDFS的,而是存储在Hive自带的Derby文件型数据库中
6、Hive安装完成之后实际开发中通常要替换元数据库,到目前为止Hive只支持Derby和MySQL两种数据库,需要
将Derby替换为MySQL
7、Derby存在的问题:
①Derby数据库是一种文件型数据库,在进入检查的时候当前目录下是否存在metastore.db文件夹,该文件夹
用来存储数据库数据的,如果有则直接使用如果没有就会默认创建一个新的目录,一旦更换目录那么意味着元数据
就丢失了
②Derby数据是一个单用户的数据库,无法支持多用户同时操作,而Hive使用Derby作为元数据库那么意味着也只能支持单用户操作,这就导致了数据量大且链接多的情况下会产生大量的连接积压
二、配置Hive的元数据库
1、编辑环境变量:vim /etc/profile
添加配置:
1 | JAVA_HOME=/home/software/jdk1.8 |
配置完成之后需要重新生效:source /etc/profile
2、配置Hive的conf目录下的hive-env.sh文件
①复制模版文件:cp hive-env.sh.template hive-env.sh
②添加配置:
1 | export JAVA_HOME=/home/software/jdk1.8 |
3、编辑hive-site.xml文件
添加配置:
1 | <?xml version="1.0" encoding="UTF-8" standalone="no"?> |
4、将MySQL的驱动包拷贝至Hive的lib目录下
1 | cp mysql-connector-java-5.1.38-bin.jar /home/software/hive-2.3.7/lib/ |
5、执行初始化操作
1 | schematool -initSchema -dbType mysql |
6、进入MySQL数据库会出现hive数据库,并且在该库下会出现57张数据表
1 | mysql> show tables; |
7、开启Hive的元数据服务
1 | hive --service metastore & |
8、进入Hive客户端
1 | hive |
三、Hive的常用命令
| create database park; | 创建park数据库 |
|---|---|
| use park; | 切换数据库 |
| show tables; | 查看当前数据库下的所有数据表 |
| create table student(id int,name string); | 创建student表及相关的两个字段 |
| insert into student values(1,’tom’); | 向student表中插入数据 |
| select * from student; | 查询表数据 |
| load data local inpath ‘/home/haha.txt’ into table student; | 通过加载本地文件到指定的表中(发现HDFS的student目录多了一个文件,由此可见Hive的工作原理就是管理HDFS上的数据) |
| create table student(id int,name string) row format delimited fields terminated by ‘ ‘; | 创建student表并且指定分隔符为空格 |
| desc student; | 查看student表结构 |
| create table student1 like student; | 创建student1表,表结构和student表结构,只是复制表结构而不能复制表数据 |
| insert overwrite table student1 select * from student; | 将student表中的数据插入到student1表中 |
| insert overwrite local directory ‘/home/stu’ row format delimited fields terminated by ‘ ‘ select * from student1; | 将student1表中的数据写到本地的/home/stu目录下 |
| alter table student rename to student2; | 为student表重命名为student2 |
| alter table student1 add columns(age int); | 为student1表中添加一个字段age |
| exit; | 退出Hive |
四、Hive的表结构
1、内部表
先在Hive中建立一个表结构然后向这个表中插入数据
2、外部表
①HDFS里面已经存在数据,然后通过Hive创建表结构管理HDFS上的数据
②建表语句(指定的Location要求是一个目录而不是一个文件):
1 | create external table flow(phone string,city string,name string,flow int) row format delimited fields terminated by ' ' location '/flow'; |
③内部表在被删除的时候,对应的目录会立即从HDFS上移除;外部表被删除的时候,对应的数据并不会被删除
实际开发中,一般在大数据海量数据处理的前提下最开始的是会先建立外部表
3、分区表
①作用:对数据进行分类的
②示例
1、建表语句
1 | create table cities(id int,name string) partitioned by (province string) row format delimited fields terminated by ' '; |
2、加载数据
1 | load data local inpath '/home/hivedemo/shanxi.txt' into table cities partition(province = 'shanxi'); |
③每一个分区在HDFS上对应的了一个目录,如果在查询的时候指定分区,那么查询效率就会相对而言比较高,
如果在查询的时候跨分区查询那么效率反而会比较低
④将HDFS上的目录添加为分区
1 | alter table cities add partition(province = 'shandong') location '/home/software/hive-2.3.7/warehouse/park.db/cities/province=shandong'; |
⑤批量修复 — 本身不稳定,在分区较多的情况下可能会修复失败
1 | msck repair table cities; |
⑥删除分区
1 | alter table cities drop partition(province = 'hebei'); |
⑦修改分区名称
1 | alter table cities partition(province = 'hubei') rename to partition(province = 'hb'); |
⑧多字段分区
1、建表语句
1 | create table student(id int,name string) partitioned by (grade string,class string) row format delimited fields terminated by ' '; |
2、加载数据
1 | load data local inpath '/home/hivedemo/g1c1.txt' into table student partition (grade = '1',class = '1'); |



