【Hive】(二)Hive入门——架构和基础命令

什么是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,比查询所有的速度慢 ,相对而言

发布了27 篇原创文章 · 获赞 19 · 访问量 1284

猜你喜欢

转载自blog.csdn.net/weixin_42804692/article/details/103495860