目录
- 简介
- 数据结构
- 数据类型
- 数据模型
- 常用DDL语句
简介
Hive是基于Hadoop的数据仓库大数据组件。将易上手的SQL语句转化成MapReduce作业。
Hive默认不支持事务, 进而导致不支持UPDATE, DELETE这些我们在数据库中常用的操作。这一点我一直感到十分不解,你一个数据库怎么连基本的操作都不支持啊?在实际使用中我终于慢慢明白:
- 为了实现事务是需要做大量工作的,写redo log,undo log(用于回滚操作),设置隔离级别(读未提交?读已提交?可重复读?)
- 而这些工作会影响到数据库的性能,拓展性,即使是较先进的Oracle的理论拓展性也才是100台,8台节点后边际效应明显。如果Hive支持事务,性能与拓展性将受到严重限制。
- Hive的作用是简单使用MapReduce 而MapReduce生来的意义就是处理大量的数据,而具备强拓展性才让处理海量数据成为可能;
- 如果丢失了拓展性与性能,MapReduce有什么意义 如果拓展性受到严重限制,MapReduce就不能处理大量的数据,那么Hive也就失去了原本的意义;
- 数据仓库中的数据是读多写少的,往往在加载时就已确定不再修改。
数据结构
- 元数据
Hive存储的是一张张的数据表,而元数据就是其中的表结构;
存储形式:存于Derby数据库,或MySQL,Oracle数据库。 - 表数据
表中存储的数据。
存储形式:每张表存于HDFS中的一个目录中;
数据类型
- 基本数据类型
- tinyint / smallint / int / bigint : 整数类型
- float / double : 浮点数类型
- boolean : 布尔类型
- string : 字符串类型
- 复杂数据类型
- Array : 数组类型
- Map : 集合类型,键值对Key / Value形式
- Struct : 结构类型,包含不同数据类型的元素,跟C语言中的Struct类似
- 时间数据类型
- Date : 只包含到天的数据,没法精确到时分秒。
- Timestamp : 长整型数字,从(格林威治时间)1970年1月1日0时0分0秒到现在的总毫秒数
数据模型
MySQL,Oracle用表作为数据模型存储数据。Hive自然也有。下面简要介绍一下Hive的几种常用的表吧。
- 内部表
最接近普通关系型数据库的数据模型;
删除数据时会将元数据与表数据一同删除,HDFS中的数据文件一同被删除;
create table internal_table
(sid int, sname string, age int)
row format delimited fields terminated by '\t';
-- 指定数据间分隔符,默认为制表符'\t'
- 外部表
与HDFS中某个目录下的数据文件建立连接;
比较像指针,指向HDFS中某个目录;
删除数据时,会删除元数据,与该目录的连接,但不会真正删除HDFS中的数据;
create external table external_student
(sid int, sname string, age int)
row format delimited fields terminated by '\t'
location '/input'; --指定表数据所在 HDFS目录
- 桶表
用哈希算法将表数据分到5个桶中,一般可以将数据打乱放到各个桶中,可以处理数据倾斜问题
create table bucket_table
(sid int, sname string, age int)
clustered by(sname) into 5 buckets --将数据通过哈希算法分成5部分
row format delimited fields terminated by '\t';
常用DDL语句
#表结构
desc table1;
#详细表结构信息
desc formatted table1;
#建表语句
show create table table1;
#hive 单独执行该段 SQL 语句(可以不止一条)
hive -e "sql;"
#hive 执行一个 SQL文件
hive -f '/test/file1.sql'
#将数据导入至本地
insert into local directory '/dir1/' select * from table1 limit 20;
#数据插入至分区表
insert overwrite table2 partition(report_time = '20200901') select field1, field2 from table1;
#将数据导入至本地,字段间按,分割
insert overwrite local directory '/xxx/xxx' row format delimited fields terminated by ',' select * from tablex limit 100;
#添加表分区
alter table table1 add if not exists partition(date=20200101);
#删除表分区
alter table table1 drop if exists partition(date=20200101);