1、什么是Hive?
Hive是基于Hadoop的一个数据仓库工具,将结构化的数据文件映射为一张表,提供与SQL类似的查询功能。
1.1本质
将HQL转换成MR程序
Hive处理的数据存储在HDFS上,分析数据由MR实现,执行程序在YARN上。
优点:适合处理对实时性要求不高的大数据。
缺点:不适合迭代算法、数据挖掘。
1.2 Hive框架的驱动器具有哪些?
(1)解析器(SQL Parser):将SQL字符串转换成抽象语法树(AST),这一步一般都用第三方工具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。
(2)编译器(Physical Plan):将AST编译生成逻辑执行计划。
(3)优化器(Query Optimizer):对逻辑执行计划进行优化。
(4)执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/Spark/Flink。
2、Hive的元数据是什么?
数仓的元数据是关于数据仓库中数据的数据。类似于数据库管理系统的数据字典,保存了逻辑数据结构、文件、地址和索引等信息。
元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等。
元数据存储在关系型数据库中。(还有以数据集为基础的存储方式)
3、外部表的优点
Hive的外部表相对内部表(管理表)更安全。因为外部表被删除时,删除的时描述表的元数据信息,而不是删除该表数据,内部表则会删除表中数据。内部表通常是创建临时表使用。
4、分区表
Hive分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。
4.1 分区表的特点
提高查询效率。可以进行多级分区。
4.2 分区表的优点
为什么提高查询效率?
分区之后,使用WHERE语句限定需要查找表的分区信息。首先去访问元数据库(sql),找HDFS对应的实际数据的路径,由于执行WHERE语句时获取分区信息,则在未访问HDFS之前,就已经知道之后访问HDFS的具体目录。
如果缺乏分区元数据信息,或缺乏数据该怎么办?
1)使用load命令,既添加分区元数据信息,又上传数据。
2)msck repair table 表名(),多在有很多分区信息需要修复的情况下使用。
3)上传数据后,添加分区信息alter table 表名 add partition(分区信息);
5. 数据库DDL操作
5.1 创建、查询(与SQL基本类似)
创建
create database if not exists 库名;
查询
show databases;
查询数据库的详细信息
desc database extended db_hive;
删除
drop database 数据库名;
5.2 修改、增加数据库信息
在Hive中,数据库的元数据信息是不可更改的。
通常是增加或修改描述数据库属性信息
alter database 数据库名 set dbproperties('键'='值');
5.3 表的创建(常用字段)
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] 表名
(col_name data_type [COMMENT col_comment], ...)]
COMMENT table_comment]
PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)
CLUSTERED BY (col_name, col_name, ...)
ROW FORMAT row_format
STORED AS file_format
LOCATION hdfs_path
最基本的建表
CREATE TABLE 表名
EXTERNAL:创建一个外部表,可以在创建时,指定LOCATION将HDFS上面的数据和该表关联起来,数据共享。也可以创建完之后Load Data。
COMMENT:为表和列添加注释
PARTITIONED BY:创建分区表
CLUSTERED BY:创建分桶表
ROW FORMAT:数据切分格式
[FIELDS TERMINATED BY char] 字段切分
[COLLECTION ITEMS TERMINATED BY char] 数组集合的切分
[MAP KEYS TERMINATED BY char] Map类型的键值对切分
举个栗子:
1,Tom;Jerry,China-Beijing
上述数据的切分格式:
FIELDS TERMINATED BY ‘,’
COLLECTION ITEMS TERMINATED BY ‘;’
MAP KEYS TERMINATED BY ‘-’
STORED AS:指定存储文件类型
如果某个与现有表结构相似,不要忘了LIKE,复制结构,建表又快又准备。
LOCATION hdfs_path:上传到指定路径地址
5.4 内部、外部表转换
alter table 表名 set tblproperties('EXTERNAL'='TRUE'|'FALSE');
显然内部转外部 ‘EXTERNAL’=‘TRUE’
外部转内部 ‘EXTERNAL’=‘FALSE’
5.5 分区表查询
分区表查询需要使用WHERE关键字,将筛选分区信息
SELECT * FROM 表名 WHERE 分区信息;
6. 增、改,替换、删除
6.1 增、改(与SQL一致)
增(列、分区):add
ALTER TABLE 表名 ADD COLUMNS (列名 数据类型, ...)
ALTER TABLE 表名 ADD PARTITION(分区信息)
# 一次性添加多个
ALTER TABLE 表名 ADD PARTITION(分区信息) PARTITION(分区信息)
改(表):rename to
ALTER TABLE 旧表名 RENAME TO 新表名
改(列):change
ALTER TABLE 表名 CHANGE COLUMN 旧的列名 新的列名 新列的类型 [FIRST|AFTER 列名]
6.2 替换(replace替换展示出来的是整个替换出来的表)
替换:replace
ALTER TABLE 表名 REPLACE COLUMNS (列名 数据类型, ...)
Mysql中的replace方法用来改变某列的值中的某些字符,更新替换或者插入替换
UPDATE 表名 SET 列名 = REPLACE(列名, 替换目标, 替换值);
6.3 删除数据库、表名、索引、视图
drop database \ table \ index \ view 名;
drop database 数据库名 cascade; (数据库不为空的情况下)
删除分区也用drop
alter table 表名 drop partition (分区信息);
# 删除多个
alter table 表名 drop partition (分区信息),partition (分区信息),...;
7. 小结
Hive的本质需要清楚,用于共享的数据通常建立外部表去处理,数据只是暂时处理,可以使用内部表(管理表),大多数分区表针对时间进行分区。