Hive是基于Hadoop HDFS分布式文件系统的分布式数据仓库架构。它为数据仓库的管理提供了许多功能:数据ETL(抽取、转换和加载)工具,数据存储管理和大型数据集的查询和分析能力。同时Hive还定义了类SQL的语言(HiveQL)。允许用户进行和SQL相似的操作,它可以将结构化的数据文件映射为一张数据库表,并提供简单的SQL查询功能。还允许开发人员方便的使用Mapper和Reducer操作,可以将SQL语句转换为MapReduce任务运行。
Hive体系架构更多大数据学习视频资料加我扣扣群498856122获取全套学习视频资料,每天更新学习资料欢迎加入
用户接口,包括CLI,JDBC/ODBC,WebUI
元数据存储,通常存储在关系数据库如mysql,derby中。元数据包括表的名字,表的列和区分及其属性,表的属性(是否为外部表等),表的数据所在目录
底层驱动:解释器、编译器、优化器、执行器。HiveQL查询语句从词法分析。语法分析,编译,优化以及查询计划生成。生成的查询计划存储在HDFS中,并在后面的MapReduce中进行调用执行
Hadoop:使用HDFS进行存储,利用MapReduce进行计算
Hive与关系数据库的区别
存储文件的系统不同,Hive使用Hadoop的分布式文件系统,关系数据库则是服务器本地的文件系统
计算模型不同,Hive使用MapReduce进行计算,关系数据则是自己设计的计算模型
实时性区别,关系数据库都是为实时查询的业务进行设计的,而Hive则是为海量数据做数据挖掘设计的,实时性很差
扩展能力区别,Hive很容易扩展自己的存储能力和计算能力(继承Hadoop),而关系数据库在这方面要差很多
Hive的基本特性
通过类SQL查询语言进行分析大数据,避免了开发MapReduce程序,这样使得分析数据更容易
数据是存储在HDFS上的,Hive本身并不提供数据的存储功能
Hive是将数据映射成数据库和表,库和表的元数据信息一般存在关系数据库上(Mysql)
存储很大的数据集,并且对数据完整性、格式要求不严格
不适用于实时计算和响应,常用于离线分析
Hive中的基本数据类型
基本数据类型
Hive支持关系数据库中大多数据基本数据类型,同时也支持三种复杂类型。
数据类型 |
长度 |
备注 |
---|---|---|
Tinyint |
1 字节的有符号整数 |
-128~127 |
SmallInt |
2 个字节的有符号整数 |
-32768~32767 |
Int |
4 个字节的有符号整数 |
-2147483648 ~ 2147483647 |
BigInt |
8 个字节的有符号整数 |
9223372036854775808 ~ 9223372036854775807 |
Boolean |
布尔类型,true 或者 false |
true、false |
Float |
4字节单精度浮点数 |
|
Double |
8字节双精度浮点数 |
|
DECIMAL |
任意精度数字 |
|
String |
字符串 |
|
TimeStamp |
整数 |
支持 Unix timestamp,可以达到纳秒精度 |
Binary |
字节数组 |
|
Date |
日期 |
0000-01-01 ~ 9999-12-31,常用 String 代替 |
复杂数据类型
数据类型 |
长度 |
备注 |
---|---|---|
array |
长度不定 |
类似java中List。一组长度不定,具有相同类型元素的集合,可以通过下标(从0开始)索引 |
map |
长度不定 |
类似java中的map。一组长度不定,键和值类型预定义的集合,通过键映射 |
struct |
长度固定 |
类似C中的struct。一组长度固定,成员的名称和类型预定义,但是成员之间相互独立的接口,通过”.”号访问 |
Hive表
创建表
-- 直接建表法create table t_page_view
(
page_id bigint comment '页面ID',
page_name string comment '页面名称',
page_url string comment '页面URL' )
comment '页面视图'partitioned by (ds string comment '当前时间,用于分区字段')
stored as parquet
location '/user/hive/warehouse/t_page_view';-- 查询建表法create table t_page_view2 as select * from t_page_view;-- like建表法(克隆表)create table t_page_view3 like t_page_view;
Hive表类型
内部表
Hive中默认创建的是内部表,每张内部表在HDFS都有相应的目录来存储表数据,默认实在/user/hive/warehouse
目录中创建。如果删除了内部表,那么这个表的数据和元数据都将被删除。
CREATE TABLE pokes
(
foo INT,
bar STRING
);
外部表
Hive中外部表和内部表很类似,但是数据不是放在默认的目录中(如果不指定目录,数据还是存储在默认的目录中)。Hive可以创建外部表和HDFS,HBase,Elasticsearch等进行整合。删除外部表时,只会删除元数据,不会删除真实数据。
CREATE EXTERNAL TABLE IF NOT EXISTS tb_station(
station string,
lon string,
lat string
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LOCATION '/user/test/coordinate/';
分区表
Hive表的数据是存储在HFDS中对应的目录中,普通表的数据直接存储在这个目录下,而分区表存储时,会再划分子目录来存储,一个分区一个子目录。主要作用是来优化查询性能。在Hive表查询的时候,如果指定了分区字段作为筛选条件,那么只需要到对应的分区目录下去检索数据即可,减少了处理的数据量,从而有效的提高了效率。在对分区表进行查询时,尽量使用分区字段作为筛选条件
CREATE TABLE invites
(
foo INT,
bar STRING
)
PARTITIONED BY (ds STRING);
桶表
分桶是将数据分解成更容易管理的若干部分的技术,桶表示对数据源数据文件本身来拆分数据。桶表会将源数据文件按照一定规律拆分成多个文件。创建桶表时,需要制定桶的个数,分桶的依据字段,Hive就可以自动将数据分桶存储。查询时,只需要遍历一个桶里的数据,或者遍历部分桶,这样就提高了查询效率。
CREATE TABLE dealer_leads
(
leads_id STRING,
dealer_id STRING,
user_id STRING,
user_phone STRING,
user_name STRING,
create_time STRING
)
CLUSTERED BY (dealer_id)
SORTED BY(leads_id)
INTO 10 BUCKETS
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;
数据导入导出
数据导入
-- 将本地文件导入到hiveload data local inpath '/home/hadoop/student' overwrite into table student partition(state='Sichuan', city='Chengdu');-- 将hdfs上文件导入到hiveload data inpath '/user/hadoop/add.txt' into table student partition(state='Sichuan', city='Chengdu');-- 从别的表中查询出相应的数据并导入到hive表中insert into table test partition(age='25') select id ,name from wyp where age='25';-- 在创建表的时候通过从别的表中查询出相应的记录并插入到所创建的表中create table tmp as select * from student where age>'18';
数据导出
-- 导出到本地文件系统insert overwrite local directory '/home/hadoop/student' select * from student;-- 导出到hdfsinsert