Hive概述
Hive基于Hadoop的数据仓库工具,提供了一系列的工具,可以用来进行数据提取、转化、加载,是一种可以存储、查询和分析存储在Hadoop中的大规模数据机制。它可以将结构化的数据文件映射成一张表,并提供完成的sql查询功能,可以将sql语句转换成MapReduce任务进行运行。
Hive本质上是基于Hadoop的一种分布式计算框架,底层仍然是MR,本质上是离线大数据分析工具。
数据仓库 VS 数据库
数据库 | 数据仓库 | |
---|---|---|
系统类型 | Online Transaction Processing OLTP 联机事务处理系统 |
Online Analytical Processing OLAP 联机分析处理系统 |
服务对象 | 为线上系统提供实时查询 | 为离线分析存储历史数据 |
功能分类 | 具有完整的增删改查能力 | 只支持一次写入多次查询,不支持航级别的增删改 |
事务特征 | 具有完整的事务能力 | 不强调事务的特性 |
设计原则 | 避免冗余 提高存储和处理的效率 | 人为冗余 提高查询的效率 |
Hive特点
- 建立表格时,不是建立一张传统意义的数据表,而是将数据文件映射成一张数据库表,并提供完整的sql查询功能
- 受限于Hadoop的HDFS设计,1.0不支持行级别增删改,2.0可以支持追加操作
- 离线数据分析工具
- 不支持事务的特性,追求性能
- 通常会通过制造冗余来提高数据查询性能
安装配置要点
需配置JAVA_HOME和HADOOP_HOME,并配置MySQL来替换内部的Derby数据库存储元数据。
内置Derby问题:
- 数据易消失:Derby为文件型数据库,进入时会检查当前目录是否会有metastore.db的文件夹(存储数据库),没有就新建,会造成换目录登录,元数据就找不到。
- 仅支持单用户操作:Derby是单用户型的数据库,无法支持多用户操作。
配置MySQL要点:
- 修改conf/hive-site.xml 文件
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop01:3306/hive?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
<description>password to use against metastore database</description>
</property>
- 将mysql驱动【mysql-connector-java-******-bin】复制到hive的lib目录下
- mysql元数据库中的hive库,必须是latin1的编码集
Hive的重要的元数据表
DBS :存储了hive中库元数据的信息,包括库编号、库名称 库所有者 库对应在hdfs中的存储位置
TBLS:存储了hive中表相关的信息,包括表的编号、所属库的编号、表所有者、表名称、表类型
COLUMNS_V2:存储了hive中表对应列的信息,包括所属表的编号、列名称、列类型、列的位置
SDS:存储了hive中表对应在HDFS中的存储位置信息,包括表的编号、存储位置
Hive的各种表
1 内部表 VS 外部表
对比项 | 内部表 | 外部表 |
---|---|---|
定义 | 先有表再有数据 | 先有数据再有表 |
特点 | 执行表格删除时,会删除原表 | 执行表格删除时,不会删除原表 |
创建语句 | create table student (id int, name string) row format delimited fields terminated by ‘\t’; |
create external table teacher (id int ,name string) row format delimited fields terminated ‘\t’location ‘/teacher’; |
导入表格 | load data local inpath ‘/home/software/1.txt’ into table stu; |
本来就是导入的 |
2 分区表
表的文件夹下再创建分区对应的文件夹,将表中的数据按照分区字段分放在不同的分区文件夹下,这样之后按照分区字段查询数据时,可以直接找到分区文件夹得到数据,而不用在全部数据中进行过滤,从而提升了查询的效率。
2.1 操作语法
创建表:
create table book (id bigint, name string) partitioned by (country string,…) row format delimited fields terminated by ‘\t’;
加载数据:
load data local inpath ‘./book_china.txt’ into table book partition (country=‘china’,…);
修改结构分区:
alter TABLE book add PARTITION (country=‘jp’,category = ‘xs’) location ‘/user/hive/warehouse/…’;
查询表:
select * from book where category=‘cn’;
显示分区:
show partitions iteblog;
删除分区:
alter table book drop partition(category=‘cn’)
修改分区:
alter table book partition(category=‘french’) rename to partition (category=‘hh’);
3 分桶表
Hive中也支持分桶表,分桶表是一种更细粒度的数据分配方式,主要作用是实现数据的抽样,方便进行数据测试。分桶表通过hash分桶算法,将数据分放在不同的桶(hdfs中的文件)中,方便后续获取。
3.1 分桶语法
开启分桶功能:hive>set hive.enforce.bucketing=true;
创建带桶的表:create table teacher(name string) clustered by (name)into 3 buckets row format delimited fields terminated by ‘’;
Hive的分桶过程是在底层的MR中实现的,所以必须在一个MR过程中分通才可以实现,通常我们不会直接在原始的表中实现分通,而是单独创建一个带有分通的测试表,从原始表中向分桶的测试表中导入数据,在导入的过程中,触发MR操作,实现分桶。
往表里插入数据:insert overwrite|into table teacher selec