Hive定义
Hive 是一种数据仓库技术,用于查询和管理存储在分布式环境下的大数据集。构建于Hadoop的HDFS和MapReduce上,用于管理和查询分析结构化/非结构化数据的数据仓库;
- 使用HQL(类SQL语句)作为查询接口;
- 使用HDFS作为底层存储;
- 使用MapReduce作为执行层,即将HQL语句转译成M/R Job然后在Hadoop执行
Hive的表其实就是HDFS的目录/文件夹,按表名把文件夹分开。如果是分区表,则分区值是子文件夹;
Hive概述—元数据、数据、目录
- 元数据保存在DB(Derby/MySQL)中,包括表的名字、表的列和分区及其属性,表的属性包括是否为外部表等,表的数据所在目录等;
- 数据位于集群目录下:
- 内部表:/user/hive/warehouse/表名;
- 外部表:用户自定的目录;
- 表的数据即文件(表对应文件夹下);上传文件即相当于上传数据到数据表中;文件可以有多个;表的分区对应子目录;
Hive概述—Hive Shell
Hive Shell 把 HiveQL 查询转换为一系列 MapReduce 作业对任务进行并行处理, 然后返回处理结果。
Hive 采用 RDBMS 表 (table) 形式组织数据
, 并为存储在 Hadoop上的数据提供附属的对数据
进行展示的结构描述信息,该描述信息称为元数据
(metadata)或表模式,以 metastore 形式存储在
RDBMS 数据库中。
Hive使用—内、外部表的区别
两者的相同点:需要指定元数据;都支持分区
不同点:实际数据的存储地点不同
- 内部表。实际数据存储在数据仓库目录(默认集群/user/hive/warehouse 下)。删除表时,表中的数据和元数据将会被同时删除。
- 外部表。实际数据存储在创建语句location指定的HDFS路径中,不会移动到数据库目录中。如果删除一个外部表,仅会删除元数据,表中的数据不会被删除。
Hive使用—分区Partition
在实际项目中,经常“按天分表 的模式设计数据库!Hive分区类似数据库中相应分区列的一个索引;Hive表中的一个分区对应表下的一个目录,所有分区的数据都存储在各自对应的子目录中
例如:htable包含ds、city两个分区,则相同日期、不同
城市的hdfs目录分别为:
- /datawarehouse/htable/ds=20100301/city=GZ
- /datawarehouse/htable/ds=20100301/city=BJ
Hive使用—桶Bucket
桶对指定列进行哈希(hash)计算时,根据哈希值切分数据,每个桶对应一个文件。
例如:将属性列user分散到32个桶中,哈希值为0、10的分别对应的文件为:
- /datawarehouse/htable/ds=20100301/city=GZ/part-00000
- /datawarehouse/htable/ds=20100301/city=GZ/part-00010
Hive使用—分区、分桶、索引
- 索引和分区最大的区别就是索引不分割数据表,分区分割数据表。
- 分区和分桶最大的区别就是分桶随机分割数据表,分区是非随机分割数据表。
Hive使用—Hive 表 DDL 操作
- Create/Drop/Alter 数据库
- Create/Drop/Truncate 表
- Alter 表/分区/列
- Create/Drop/Alter 视图
- Create/Drop/Alter 索引
- Create/Drop 函数
- Create/Drop/Grant/Revoke 角色和权限
Hive使用—Hive 表 DML 操作
- 将文件中的数据Load到 Hive 表中
- select 操作
- 将 select 查询结果插入 hive 表中
- 将 select 查询结果写入文件
- Hive 表 ACID 事务特性
Hive使用—Hive数据类型
基本数据类型:
- tinyint/smallint/int/bigint 整数类型
- float/double 浮点类型
- boolean 布尔类型
- string/varchar/char 字符串类型
复杂数据类型: - array:数组类型,由一系列相同的数据类型的元素组成
- map:集合类型,包含key->value键值对,可通过key访问元素。
- struct:结构类型,可以包含不同数据类型的元素,这些元素可以通过“点语法”的方式来得到所需要的元素。
时间类型: - Date: 日期(年月日)
- Timestamp: 是unix的一个时间偏移量
- select unix_timestamp(); 查看系统的时间偏移
Hive使用—Hive表操作语法
创建表
- external 外部表,类似于mysql的csv引擎
- partitioned by 指定分区字段
- clustered by sorted by 可以对表和分区对某个列进行分桶操作,也可以利用sorted by对某个字段进行排序
- row format delimited fields terminated by ‘\t’ 指定数据行中字段间的分隔符和数据行分隔符
- stored as 指定数据文件格式:textfile sequence rcfile inputformat (自定义的inputformat 类)
- location 指定数据文件存放的hdfs目录
内部表建表指令(示例)
CREATE TABLE pokes (foo INT, bar STRING) row format delimited fields terminated by ‘\t’;
外部表建表指令(示例)
CREATE external TABLE ext_pokes (foo INT, bar STRING) row format delimited fields terminated by ‘\t’ location ‘/data/extpokes’
删除表
- drop table [IF EXISTS] table_name
- 删除内部表时会删除元数据和表数据文件
- 删除外部表(external)时只删除元数据
修改表
Hive使用—HiveQL加载数据
加载文件数据:(local 本地、hdfs)文件数据到指定的表分区
LOAD DATA LOCAL INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');
从指定表中选取数据插入到其他表中
FROM src
INSERT OVERWRITE TABLE dest1 SELECT src.*
WHERE src.key < 100
INSERT OVERWRITE TABLE dest2 SELECT src.key,
src.value WHERE src.key >= 100 and src.key < 200