文章目录
- 什么是hive
- hive 体系架构
- Hive 和数据库比较
- Hive数据类型
- 数据表(Tables)
- 表操作 删除/修改
什么是hive
基于Hadoop的数据仓库解决方案
hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并 提供类 SQL 查询功能。用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。
本质是:将 HQL 转化成 MapReduce 程序
1)Hive 处理的数据存储在 HDFS
2)Hive 分析数据底层的实现是 MapReduce
3)执行程序运行在 Yarn 上
hive 体系架构
用户接口
CLI(hive shell)、JDBC/ODBC(java 访问 hive)、WEBUI(浏览器访问 hive)元数据MetaStore
元数据包括:表名、表所属的数据库(默认是 default)、表的拥有者、列/分区字段、表 的类型(是否是外部表)、表的数据所在目录等; 默认存储在自带的 derby 数据库中,推荐使用 MySQL 存储 Metastore
通常存储在关系型数据库中(mysql,derby)
Driver驱动
(1)解析器(SQL Parser):将 SQL 字符串转换成抽象语法树 AST,这一步一般都用 第三方工具库完成,比如 antlr;对 AST 进行语法分析,比如表是否存在、字段是否存 在、SQL 语义是否有误。
(2)编译器(Physical Plan):将 AST 编译生成逻辑执行计划。
(3)优化器(Query Optimizer):对逻辑执行计划进行优化。
(4)执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于 Hive 来 说,就是 MR/Spark。
Hive不存数据,数据依附(存储)在HDFS,查询,计算由MapReduce执行
Hive 和数据库比较
查询语句类似,针对 Hive 的特性设计了类 SQL 的 查询语言 HQL
MySQL | Hive | |
数据存储位置 | Hive 是建立在 Hadoop 之上的,所有 Hive 的数据都是存储在 HDFS 中的 | 数据库则 可以将数据保存在块设备或者本地文件系统中 |
数据更新 | Hive 中不建议对数据的改写,所有的数据都是在加载的时候确定好的 | 数据库中的数据通常是需要经常进行修改的 , 因此可以使用INSERT INTO … VALUES添加数 据,使用UPDATE … SET修改数据 |
索引、执行延迟 | hive 不建立索引,Hive 要访问数据中满足条件的特定值时,需要暴力扫描整个数据,因此访问延迟较高 | 数据库中,通常会针 对一个或者几个列建立索引,因此对于少量的特定条件的数据的访问,数据库可以有很高的 效率,较低的延迟 |
执行 | MapReduce | 有自己的执行引擎 |
可拓展性 | Hive 的可扩展性是和 Hadoop 的可扩展性是一致的 | 数 据库由于 ACID 语义的严格限制,扩展行非常有限 |
Hive数据类型
复杂数据类型
ARRAY:存储的数据为相同类型
MAP:具有相同的类型的键值对
STRUCT:封装了一组字段
元数据的结构
数据表(Tables)
分为内部表和外部表
内部表
HDFS中为所属数据库目录下的子文件夹
数据完全由Hive管理,删除表(元数据)会删除数据
外部表(External Tables)
数据保存在指定位置的HDFS路径中
Storage SerDe:存储数据的类型,序列化和反序列化
常用:SEQUENCEFILE ORC AVRO
创建外表
关键字 external
建表语法
create external table (if not exists) [table_name](
[field_name1] string, # 所有的字段以及数据类型
[field_name2] int,
[field_name3] struct<sex:string,age:int>,
[field_name4] array<string>,
...
[field_namen] map<string,array<string>>,
)comment '注释' # 可选
row format delimited
fields terminated by ' ' #分隔列
collection items terminated by ',' #分隔集合和映射
map keys terminated by ':'
stored as textfile # 文件存储格式
localtion '路径' # 数据存储路径
create external table userinfos(
id string,
name string,
sex string,
age int
)
row format delimited fields terminated by ' '
location '/user';
建表的高阶语句CTAS
只能内部表===>内部表,不能创建partition、external、bucket table
create table [table_name] as select * from employee;
CTE
create table employees as
with
r1 as (select empname from emps where empname='zhang' and sex=1),
r2 as (select empname from emps where and sex=0)
select * from r1 union all select * from r2;
LIKE
有复制表的意思
create table [new_table_name] like [table_name]
表操作 删除/修改
删除
drop table if exists [table_name] (with perge)# with perge 直接删除(可选)
truncate table [table_name] # 清空表数据
修改表(Alter针对元数据)
#修改表名
alter table [table_name] rename to [newtable_name];
#修改字段的分隔符号
alter table [table_name] set serdeproperties ('field.delim'=' ');
# 修改表的列名
alter table [table_name] change [old_field] [new_field] string
# 添加列
alter table [table_name] add columns [field_name][类型]
# 替换列
alter table [table_name] replace columns [field_name][类型]
其他操作
#查看表结构
show table [table_name];
# 查看表的详细信息
describe formatted [table_name];
#导入表数据
load data inpath '文件路径' into table [table_name]
PS:对于MySQL 聚合查询只对列遍历,速度要比查询所有快;对于Hive聚合查询需要调用mapReduce,比查询所有的速度慢 ,相对而言