Hive
- 一、什么是Hive?
- 二、Hive可以做什么?
- 三、Hive的表种类
- 四、Hive创建表的三种方式
- 五、Hive插入数据的方式
- 六、Hive视图
- 七、Hive索引
- 八、Hive环境搭建和部署
一、什么是Hive?
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。
Hive的优点:
其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
二、Hive可以做什么?
- 可以更加简洁的访问HDFS。
- 可以直接通过sql直接使用访问Mapreduce等框架。
- 可以把多种数据进行格式化或者结构化管理。
- 处理ETL类型的业务。( Extract-Transform-Load 抽取、转换、加载)。
三、Hive的表种类
1、内部表(受控表)
完全被Hive控制,内部表删除,元数据、源数据一同被删除。
2、临时表
生命周期是一次会话,主要用于测试。
创建临时表:create TEMPORARY table ttabc(id Int,name String)
3、外部表
不是完全受Hive控制,源数据可以在任何的目录下,删除外部表,源数据不会被删除,只是删除元数据。
创建外部表:
create external table wc_external
(word1 STRING,
word2 STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ' '
location '/test/external';
注:location可加可不加,不加location默认是在hive的工作目录区
问题:
- 如果按照外部表的规则(字段格式)创建一个新的文件。
将这个文件拷贝到工作目录区中,然后查询这个外部表发现数据量增多。 - load data inpath “/test/exeternal/t” into table wc_exeternal;
将工作目录区中的文件再次添加到这个表中,发现数据量没有增量。 - load data inpath “/t” into table wc_exeternal;
数据量增多了,但是根目录的t文件被剪切了。
4. 分区表
将源数据分到不同的Hive工作目录中存储,一个分区对应一个目录,防止暴力扫描全表。
静态分区表:
分区是由用户自定义的。
(1)单分区表
创建单分区表:
create table day_table (id int, content string) partitioned by (dt string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ;
加载数据:
①单条插入的方式往分区表中插入数据:
insert into day_table partition (dt = "9-26") values(1,"and");
②批量插入的方式往分区表中插入数据:
oad data local inpath "/root/ceshi" into table day_table partition (dt="9-27");
(2)多分区表
创建多分区表:
create table day_hour_table (id int, content string) partitioned by (dt int,hour int) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ;
加载数据:
①单条插入的方式往分区表中插入数据:
insert into day_hour_table partition(dt=9,hour=1) values(1,"a2 bc");
②批量插入的方式往分区表中插入数据:
load data local inpath "/root/ceshi" into table day_table partition (dt=10,hour=10);
删除Hive分区表中的分区:
ALTER TABLE day_table DROP PARTITION (dt=10,hour=10);
动态分区表:
动态分区可以根据数据本身的特征自动来划分分区(比如我们可以指定按照数据中的年龄、性别来动态分区)
静态分区与动态分区创建表的语句是一模一样的。
查询分区数:
show partitions gfstbl_dynamic;
5、分桶表
分桶表是由列的哈希值除以桶的个数来决定每条数据划分在哪个桶中分成不同的桶进行存储,方便随机取样以及join等操作。
创建分桶表:
CREATE TABLE psnbucket( id INT, name STRING, age INT)
CLUSTERED BY (age) INTO 4 BUCKETS
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
四、Hive创建表的三种方式
方式一(普通方式):
CREATE TABLE test(
id INT,
name STRING,
age INT,
gfs ARRAY<STRING>,
address MAP<STRING,STRING>,
info STRUCT<country:String,province:String,shi:String>
)
方式二:
create table test1 like test;
注意:只是创建表结构
方式三:
create table test2 AS SELECT id,name,gfs,address from test1;
不仅会创建相应的表结构,并且会插入数据
五、Hive插入数据的方式
1、Insert
INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement;
2、Load
load data local inpath '/root/test.txt' into table test;
3、查询其它表数据Insert到新表中
insert into rest select count(*) from table;
六、Hive视图
Hive视图与MySql数据库的视图一样。其特点有:
- 只能查询,不能做加载数据操作。
- 视图的创建,只是保存一份元数据,只有查询视图时,才进行相应操作。
- 视图一旦创建,无法修改。
- 若视图中包含了ORDER BY/LIMIT语句,当查询视图时也进行ORDER BY/LIMIT语句操作,视图当中定义的优先级更高。
问题:
在创建视图的时候会不会启动MR任务?
不会,视图的创建,只是保存一份元数据,查询视图时才执行对应的操作。
查看已创建的视图:
show tables
删除视图:
drop view view1
七、Hive索引
什么是索引?
索引类似目录,使用索引可以优化查询性能。
索引库,用于保存一些索引的元数据。
创建索引:
create index t1_index on table psn2(name)
as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'
with deferred rebuild in table t1_index_table;
查询索引:
show index on psn2;
删除索引:
DROP INDEX IF EXISTS t1_index ON psn2; //删除索引的同时,索引库也会被删除
八、Hive环境搭建和部署
Hive的搭建方式有三种:
- 本地模式
- 基于MySql的Local模式
- 基于MySql的Remote模式
搭建步骤可参考—Hive的三种搭建方式