目录
1. 数据库和数据仓库的区别
- 数据库:
真正存储和管理数据的,对数据有直接的处置权
关心的事情是 在线事务过程(OLTP) - 数据仓库:
可以利用一个或多个数据库的数据,进行数据分析。
关心的事情是 在线分析过程(OLAP)
- 数据库是面向事务的设计,数据仓库是面向主题设计的。
- 数据库一般存储业务数据,数据仓库存储的一般是历史数据。
- 数据库设计是尽量避免冗余,一般针对某一业务应用进行设计,比如一张简单的User表,记录用户名、密码等简单数据即可,符合业务应用,但是不符合分析。数据仓库在设计是有意引入冗余,依照分析需求,分析维度、分析指标进行设计。
- 数据库是为捕获数据而设计,数据仓库是为分析数据而设计。
2. hive运行原理
写sql语句,hive内部自动转成MapReduce程序执行。
原数据在hdfs上,sql语句需要使用表。
表是以目录形式存在hdfs的某个指定位置(warehouse)
可以通过数据加载的形式,把hdfs或本地的原数据加载到表(目录)中
表里的数据实际上是存放在这个目录下的文件
3. hive数据存储
3.1. 真实数据
- hive-site.xml中设置的数据仓库的位置就是hive在hdfs的根目录
- 数据仓库的路径(warehouse)同时也是default默认数据库的位置
- 新建的数据库在warehouse的路径下以 xxx.db 目录形式存在
- 不管是默认数据库还是新建数据库,数据都是在相应的数据库的目录下
以文件形式存在
3.2. 元数据
- 初始化的时候会在mysql创建一个元数据库
- 在元数据下有很多表,包括数据库,表,字段,位置,格式化等信息
- hive是通过元数据找到真实数据,如果元数据被篡改或删除,
即使真实数据存在,也无法使用
3.3. 执行过程
hive的执行顺序,先去mysql中找元数据,通过元数据找hdfs的真实数据
4. 分区和分桶
4.1. 分区
4.1.1. 什么是分区
1.是指按照数据表的某列或某些列分为多个区,区从形式上可以理解为文件夹,比如我们要收集某个大型网站的日志数据,一个网站每天的日志数据存在同一张表上,由于每天会生成大量的日志,导致数据表的内容巨大,在查询时进行全表扫描耗费的资源非常多。
2.那其实这个情况下,我们可以按照日期对数据表进行分区,不同日期的数据存放在不同的分区,在查询时只要指定分区字段的值就可以直接从该分区查找。
4.1.2. 使用场景
实际工作中分区表常常被运用于按照某一维度进行统计分析的场景下,数据被按照某一个日期、年月日等等,将一个大的文件切分成一个个小文件,分而治之,这样处理起来性能就会有显著提升。
4.1.3 分区表的好处以及注意事项
-
庞大的数据集可能需要耗费大量的时间去处理。在许多场景下,可以通过分区或切片的方法减少每一次扫描总数据量,这种做法可以显著地改善性能。
-
数据会依照单个或多个列进行分区,通常按照时间、地域或者是商业维度进行分区。比如vido表,分区的依据可以是电影的种类和评级,另外,按照拍摄时间划分可能会得到更一致的结果。为了达到性能表现的一致性,对不同列的划分应该让数据尽可能均匀分布。最好的情况下,分区的划分条件总是能够对应where语句的部分查询条件。
-
Hive的分区使用HDFS的子目录功能实现。每一个子目录包含了分区对应的列名和每一列的值。但是由于HDFS并不支持大量的子目录,这也给分区的使用带来了限制。我们有必要对表中的分区数量进行预估,从而避免因为分区数量过大带来一系列问题。
-
Hive查询通常使用分区的列作为查询条件。这样的做法可以指定MapReduce任务在HDFS中指定的子目录下完成扫描的工作。HDFS的文件目录结构可以像索引一样高效利用。
4.2. 分桶
4.2.1 什么是分桶
1.分桶是相对分区进行更细粒度的划分。
2.分桶将整个数据内容安装某列属性值得 hash 值进行区分,如要按照 name 属性分为 3个桶,就是对 name 属性值的 hash 值对 3 取摸,按照取模结果对数据分桶。
3.如取模结果为 0 的数据记录存放到一个文件,取模为 1 的数据存放到一个文件,取模为 2 的数据存放到一个文件。
分桶是通过对指定列进行哈希计算来实现的,通过哈希值将一个列名下的数据切分为一组桶,并使每个桶对应于该列名下的一个存储文件。
注意,hive使用对分桶所用的值进行hash,并用hash结果除以桶的个数做取余运算的方式来分桶,保证了每个桶中都有数据,但每个桶中的数据条数不一定相等。
4.2.2. 分桶的使用场景
取样sampling更高效。没有分桶的话需要扫描整个数据集。
提升某些查询操作效率,例如map side join