一、Hive的特点
- HQL:一种类SQL语言
- 存储位置
- Hive:所有数据存储在HDFS上
- 数据库:存储在块设备或者本地文件系统中
- 数据格式
- Hive:没有专门的数据格式,数据格式可以自定义,文件格式有三个默认格式(TextFile、SequenceFile、RCFile),由于在加载数据时不用进行格式转换
- 数据库:有自己的存储引擎,定义自己的数据格式,所以数据库加载数据的过程会比较耗时
- 数据更新
- Hive:是一种数据仓库,不支持对数据的改写和添加,所有数据都是在加载时确定的
- 数据库:可以修改
- 索引
- Hive:加载数据后没有建立索引,所以需要暴力扫描,但是在查询数据的时候实际上是MapReduce的执行过程,并行查询的效率会提高很多
- 数据库:通常针对一个或几个列建立索引
- 执行延迟
- Hive:没有索引,延迟较高,MapReduce框架也会增加延迟,不适合在线查询,并行计算特性适合大规模数据查询
- 数据库:数据规模较小的时候延迟较低
- 可扩展性
- Hive:基于HDFS,与HDFS的扩展性一致
- 数据库:由于ACID的限制,扩展性有限
二、Hive文件格式
- TextFile:直接复制数据文件到HDFS上(默认),数据不做压缩,磁盘开销大,数据解析开销大
- SequenceFile:使用方便、可分割、可压缩。支持三种压缩格式NONE、RECORD(压缩率低)、BLOCK
- RCFile
- 特点:快速加载数据、快速查询数据、最大化磁盘利用率、同一份数据集会供给不同用户分析
- 结构:先水平划分,再垂直划分
- 数据格式
- 存储在一个HDFS块中的所有记录被划分成了多个行组,对于一张表,所有行组大小都相同
- 行组第一部分:行组头部的同步标识,主要用于分隔HDFS块中两个连续行组
- 行组第二部分:行组的元数据头部,用于存储行组单元的信息,包括行组中的记录数、每个列的字节数、列中每个域的字节数
- 行组第三部分:实际的列存储数据
- 压缩方式:元数据头部(RLE算法压缩)和表格数据段压缩(Gzip算法压缩)
- 数据追加:仅支持尾部追加(每列维护一个已经记录元数据的内存column holder)
- 数据读取:仅仅读取元数据头部和给定查询的列
- Lazy压缩:如果where没有满足的列,则select查询的列没有必要解压
- 行组大小:行组大的时候数据压缩效率会比行组小的时候更高,但高于一个阈值后会占用更多内存,这会影响并发执行的其他MapReduce作业
三、Hive操作
- 创建表
- 创建表时ROW FORMAT DELIMITED 必须写在其他子句之前(除了STORED AS...)
- 设置列分隔符:FIELDS TERMINATED BY '\001'
- 设置集合元素间分隔符:COLLECTION ITEMS TERMINATED BY '\002'
- 设置map键和值之间的分隔符:MAP KEYS TERMINATED BY '\003'
- 查询表
- 没有解释成MapReduce的查询
- select * from table
- 带分区时,直接查询分区
- Hive不支持在WHERE子句中的IN、EXIST或子查询
- Hive不支持HAVING子句,可以将HAVING子句转换成一个子查询
- 不允许在一个查询内存在多个DISTINCT
- ORDER BY会对输入进行全局排序,因此只有一个Reduce
- CLUSTER BY查询除了具有DISTRIBUTE BY的功能还具有SORT BY功能
- 视图
- VIEW是逻辑存在,Hive不支持物化视图
- VIEW只读
- VIEW支持迭代视图
- 索引
- 索引Key冗余存储,提供基于Key的数据视图
- 存储设计以优化查询和检索性能
- 对于某些查询减少I/O,从而提高性能
- 分区
- 查询的时候分区的信息会添加到最后的列上,插入数据时不会检查分区数据是否正确
- 分区数据不存储在文件中
- 动态分区
- 动态分区按顺序写在SELECT后
- 不允许主分区采用动态列,而副分区采用静态列
- LIKE与RLIKE的区别
- LIKE不是正则,而是通配符; RLIKE是正则,写法与java类似
- 连接类型(对于Join,Hive会将前面的表存储在Reduce的内存中,然后后面的表流式进入Reduce与Reduce内存中的其他表进行连接)
- 内连接(inner join)
- 默认的查询方式
- 左外连接(left outer join)
- 把左边表的元组全部选出来,没有数据的内容填充NULL
- 右外连接(right outer join)
- 将右边表的元组全部选出来,没有数据的内容填充NULL
- 全外连接(full outer join)
- 综合2、3两种情况
- 左半连接(left semi-join)
- 用来代替in(子查询)或exists操作,只查询左表在右表有涉及的部分
- 笛卡尔积
- map-side join
四、数据库与数据仓库的区别
- 数据仓库(Data Warehouse)是一个面向主题的(Subject Oriented)、集成的(Integrate)、相对稳定的(Non-Volatile)、反映历史变化(Time Variant)的数据集合,用于支持管理决策。
- 面向主题:指数据仓库中的数据是按照一定的主题域进行组织。
- 集成:指对原有分散的数据库数据经过系统加工, 整理得到的消除源数据中的不一致性。
- 相对稳定:指一旦某个数据进入数据仓库以后只需要定期的加载、刷新。
- 反映历史变化:指通过这些信息,对企业的发展历程和未来趋势做出定量分析预测。
- 数据仓库建设是一个工程,是一个过程,而不是一种可以购买的产品。企业数据处理方式是以联机事务处理形式信息,并利用信息进行决策;在信息应用过程中管理信息。
- 数据仓库的出现,并不是要取代数据库。目前,大部分数据仓库还是用关系数据库管理系统来管理的。
- 数据仓库与数据库的主要区别在于:
- 数据库是面向事务的设计,数据仓库是面向主题设计的。
- 数据库一般存储在线交易数据,数据仓库存储的一般是历史数据。
- 数据库设计是尽量避免冗余,数据仓库在设计是有意引入冗余。
- 数据库是为捕获数据而设计,数据仓库是为分析数据而设计。
- HQL:一种类SQL语言
- 存储位置
- Hive:所有数据存储在HDFS上
- 数据库:存储在块设备或者本地文件系统中
- 数据格式
- Hive:没有专门的数据格式,数据格式可以自定义,文件格式有三个默认格式(TextFile、SequenceFile、RCFile),由于在加载数据时不用进行格式转换
- 数据库:有自己的存储引擎,定义自己的数据格式,所以数据库加载数据的过程会比较耗时
- 数据更新
- Hive:是一种数据仓库,不支持对数据的改写和添加,所有数据都是在加载时确定的
- 数据库:可以修改
- 索引
- Hive:加载数据后没有建立索引,所以需要暴力扫描,但是在查询数据的时候实际上是MapReduce的执行过程,并行查询的效率会提高很多
- 数据库:通常针对一个或几个列建立索引
- 执行延迟
- Hive:没有索引,延迟较高,MapReduce框架也会增加延迟,不适合在线查询,并行计算特性适合大规模数据查询
- 数据库:数据规模较小的时候延迟较低
- 可扩展性
- Hive:基于HDFS,与HDFS的扩展性一致
- 数据库:由于ACID的限制,扩展性有限
二、Hive文件格式
- TextFile:直接复制数据文件到HDFS上(默认),数据不做压缩,磁盘开销大,数据解析开销大
- SequenceFile:使用方便、可分割、可压缩。支持三种压缩格式NONE、RECORD(压缩率低)、BLOCK
- RCFile
- 特点:快速加载数据、快速查询数据、最大化磁盘利用率、同一份数据集会供给不同用户分析
- 结构:先水平划分,再垂直划分
- 数据格式
- 存储在一个HDFS块中的所有记录被划分成了多个行组,对于一张表,所有行组大小都相同
- 行组第一部分:行组头部的同步标识,主要用于分隔HDFS块中两个连续行组
- 行组第二部分:行组的元数据头部,用于存储行组单元的信息,包括行组中的记录数、每个列的字节数、列中每个域的字节数
- 行组第三部分:实际的列存储数据
- 压缩方式:元数据头部(RLE算法压缩)和表格数据段压缩(Gzip算法压缩)
- 数据追加:仅支持尾部追加(每列维护一个已经记录元数据的内存column holder)
- 数据读取:仅仅读取元数据头部和给定查询的列
- Lazy压缩:如果where没有满足的列,则select查询的列没有必要解压
- 行组大小:行组大的时候数据压缩效率会比行组小的时候更高,但高于一个阈值后会占用更多内存,这会影响并发执行的其他MapReduce作业
三、Hive操作
- 创建表
- 创建表时ROW FORMAT DELIMITED 必须写在其他子句之前(除了STORED AS...)
- 设置列分隔符:FIELDS TERMINATED BY '\001'
- 设置集合元素间分隔符:COLLECTION ITEMS TERMINATED BY '\002'
- 设置map键和值之间的分隔符:MAP KEYS TERMINATED BY '\003'
- 查询表
- 没有解释成MapReduce的查询
- select * from table
- 带分区时,直接查询分区
- Hive不支持在WHERE子句中的IN、EXIST或子查询
- Hive不支持HAVING子句,可以将HAVING子句转换成一个子查询
- 不允许在一个查询内存在多个DISTINCT
- ORDER BY会对输入进行全局排序,因此只有一个Reduce
- CLUSTER BY查询除了具有DISTRIBUTE BY的功能还具有SORT BY功能
- 视图
- VIEW是逻辑存在,Hive不支持物化视图
- VIEW只读
- VIEW支持迭代视图
- 索引
- 索引Key冗余存储,提供基于Key的数据视图
- 存储设计以优化查询和检索性能
- 对于某些查询减少I/O,从而提高性能
- 分区
- 查询的时候分区的信息会添加到最后的列上,插入数据时不会检查分区数据是否正确
- 分区数据不存储在文件中
- 动态分区
- 动态分区按顺序写在SELECT后
- 不允许主分区采用动态列,而副分区采用静态列
- LIKE与RLIKE的区别
- LIKE不是正则,而是通配符; RLIKE是正则,写法与java类似
- 连接类型(对于Join,Hive会将前面的表存储在Reduce的内存中,然后后面的表流式进入Reduce与Reduce内存中的其他表进行连接)
- 内连接(inner join)
- 默认的查询方式
- 左外连接(left outer join)
- 把左边表的元组全部选出来,没有数据的内容填充NULL
- 右外连接(right outer join)
- 将右边表的元组全部选出来,没有数据的内容填充NULL
- 全外连接(full outer join)
- 综合2、3两种情况
- 左半连接(left semi-join)
- 用来代替in(子查询)或exists操作,只查询左表在右表有涉及的部分
- 笛卡尔积
- map-side join
四、数据库与数据仓库的区别
- 数据仓库(Data Warehouse)是一个面向主题的(Subject Oriented)、集成的(Integrate)、相对稳定的(Non-Volatile)、反映历史变化(Time Variant)的数据集合,用于支持管理决策。
- 面向主题:指数据仓库中的数据是按照一定的主题域进行组织。
- 集成:指对原有分散的数据库数据经过系统加工, 整理得到的消除源数据中的不一致性。
- 相对稳定:指一旦某个数据进入数据仓库以后只需要定期的加载、刷新。
- 反映历史变化:指通过这些信息,对企业的发展历程和未来趋势做出定量分析预测。
- 数据仓库建设是一个工程,是一个过程,而不是一种可以购买的产品。企业数据处理方式是以联机事务处理形式信息,并利用信息进行决策;在信息应用过程中管理信息。
- 数据仓库的出现,并不是要取代数据库。目前,大部分数据仓库还是用关系数据库管理系统来管理的。
- 数据仓库与数据库的主要区别在于:
- 数据库是面向事务的设计,数据仓库是面向主题设计的。
- 数据库一般存储在线交易数据,数据仓库存储的一般是历史数据。
- 数据库设计是尽量避免冗余,数据仓库在设计是有意引入冗余。
- 数据库是为捕获数据而设计,数据仓库是为分析数据而设计。