一、关于Hive
1.1 什么是Hive
Hive是构建在Hadoop之上的数据仓库软件。它提供类似sql的查询语句HiveQL对数据进行分析处理,Hive将HiveQL语句转换成一系列MapReduce作业并执行。
目前,Hive除了支持MapReduce计算引擎,还支持Spark和Tez这两种分布式计算引擎,常用于离线批处理。
http://hive.apache.org/
1.2 什么是数据仓库
数据仓库(Data Warehouse),是一个面向主题、集成的、随时间变化的,但信息本身相对稳定的数据集合,用于对管理决策过程的支持。
https://www.jianshu.com/p/0b6414f92442
1.3 Hive的特点
- 可通过类SQL来分析大数据,避免了写MapReduce程序来分析数据;
- 数据存储在HDFS上,Hive本身不提供数据的存储功能;
- Hive将数据映射成数据库和一张张表,库和表的元数据信息一般存在关系型数据库上(如MySQL);
- 数据存储方面:可以存储很大的数据集,对数据完整性、格式要求并不严格;
- 数据处理方面:不适用于实时计算的场景,适用于离线分析。
二、Hive的体系结构
Hive的元数据:包括表的名字、列、分区、属性(内/外部表)以及表数据所在目录等。将元数据存储在数据库中(metastore),支持mysql、derby、oracle等数据库。
解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS中,并在随后由MapReduce调用生成。
hive编译安装并修改元数据存储库为MySQL
三、Hive重要概念
3.1 外部表和内部表
内部表(managed table)
- 默认创建的是内部表,即 create table xxx (xx xxx),存储位置在 hive.metastore.warehouse.dir 设置,默认位置为 /user/hive/warehouse
- 导入数据的时候是将文件剪切到指定位置,即原有路径下文件将不再存在
- 删除表时,数据和元数据都将被删除
外部表(external table)
- 外部表可以在外部系统上,只要有访问权限即可
- 外部表导入文件时不移动文件,仅仅是添加一个metadata
- 删除外部表时元数据不会被删除
- 分辨外部表、内部表可以用 DESCRIBE FORMATTED table_name 命令查看
- 创建外部表命令添加一个external即可,即 create external table xxx (xxx)
- 外部表指向的数据发生变化时会自动更新,不用特殊处理
3.2 分区表和桶表
分区(Partitioned)
- 有时数据是有组织的,比如按时间/类型等分类,而查询数据的时候也经常只关心部分数据,比方说 我只想查询2017年8月8日,此时可以创建分区,查询具体某一天数据时,不需要扫描全部目录,所以会明显优化性能
- 一个Hive表在HDFS上是有一个对应的目录来存储数据,普通表的数据直接存储在这个目录下,而分区表数据存储时,是再划分子目录来存储的
- 创建分区:是在创建表时,使用 Partitioned by (列名1 格式1, 列名2 格式2…) 关键字定义的
- 增加分区:
ALTER TABLE table_name ADD PARTITION (day='2018-08-08')
- 删除分区:
ALTER TABLE table_name DROP IF EXISTS PARTITION (day='2018-08-08')
外部分区表使用alter table…drop partition语句删除分区,只会删除元数据,相应的目录和文件并不会删除;内部表使用该语句删除分区,既会删除元数据,也会删除相应目录和数据文件。 - 动态分区和静态分区:主要区别在于是否指定分区目录,或由系统自己选择。
分桶(clustered)
- 分桶是相对分区进行更细粒度的划分。分桶将整个数据内容按照某列属性的hash值进行区分,按照取模结果对数据分桶,如取模结果相同的数据记录存放到一个文件
- 桶表也是一种用于优化查询而设计的表类型。创建桶表时,指定桶的个数、分桶的依据字段,hive就可以自动将数据分桶储存。查询时只需要遍历一个桶里的数据,或者遍历部分桶,这样就提高了查询效率
具体说明分桶:clustered by (user_id) sorted by (leads_id) into 10 buckets
- clustered by是根据user_id 的值进行哈希后模除分桶个数,根据得到的结果,确定这行数据分入哪个桶中,这样的分法,可以确保相同user_id 的数据放入同一个桶中
- sorted by 是指定以哪个字段进行排序,排序的好处是,在join操作时可获得较高的效率
- into 10 buckets 是指定一共分10个桶
- 在HDFS上存储时,一个桶存入一个文件中,这样根据user_id进行查询时,可以快速确定数据存在于哪个桶中,而只遍历一个桶可以提高查询效率
3.3 Hive文件格式
Hive文件存储格式包括以下几类:
- TEXTFILE
- SEQUENCEFILE
- RCFILE
- ORCFILE( 0.11以后出现)
其中,TEXTFILE为默认格式,导入数据时会直接将数据文件copy到hdfs上不进行处理;
其他三种格式的表不能直接从本地文件导入数据,数据要先导入到 TEXTFILE 格式的表中,然后再从表中用 insert 导入 SequenceFile,RCFile,ORCFile 表中。
3.4 列式存储和行式存储
Hive文件存储格式包括以下几类:
先来看一张表的存储格式: