目录

  • 简介
  • 数据结构
  • 数据类型
  • 数据模型
  • 常用DDL语句


简介

    Hive是基于Hadoop的数据仓库大数据组件。将易上手的SQL语句转化成MapReduce作业
    Hive默认不支持事务, 进而导致不支持UPDATE, DELETE这些我们在数据库中常用的操作。这一点我一直感到十分不解,你一个数据库怎么连基本的操作都不支持啊?在实际使用中我终于慢慢明白:

  1. 为了实现事务是需要做大量工作的,写redo log,undo log(用于回滚操作),设置隔离级别(读未提交?读已提交?可重复读?)
  2. 而这些工作会影响到数据库的性能,拓展性,即使是较先进的Oracle的理论拓展性也才是100台,8台节点后边际效应明显。如果Hive支持事务,性能与拓展性将受到严重限制。
  3. Hive的作用是简单使用MapReduce 而MapReduce生来的意义就是处理大量的数据,而具备强拓展性才让处理海量数据成为可能;
  4. 如果丢失了拓展性与性能,MapReduce有什么意义 如果拓展性受到严重限制,MapReduce就不能处理大量的数据,那么Hive也就失去了原本的意义;
  5. 数据仓库中的数据是读多写少的,往往在加载时就已确定不再修改

数据结构

  1. 元数据
    Hive存储的是一张张的数据表,而元数据就是其中的表结构
    存储形式:存于Derby数据库,或MySQL,Oracle数据库。
  2. 表数据
    表中存储的数据。
    存储形式:每张表存于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的几种常用的表吧。

  1. 内部表
    最接近普通关系型数据库的数据模型;
    删除数据时会将元数据与表数据一同删除,HDFS中的数据文件一同被删除;
create table internal_table
(sid int, sname string, age int)
row format delimited fields terminated by '\t';
-- 指定数据间分隔符,默认为制表符'\t'
  1. 外部表
    与HDFS中某个目录下的数据文件建立连接;
    比较像指针,指向HDFS中某个目录;
    删除数据时,会删除元数据,与该目录的连接,但不会真正删除HDFS中的数据
create external table external_student
(sid int, sname string, age int)
row format delimited fields terminated by '\t'
location '/input';  --指定表数据所在 HDFS目录
  1. 桶表
    用哈希算法将表数据分到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);