Hadoop回顾--Hive特性(一)

 一、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)的数据集合,用于支持管理决策。

    - 面向主题:指数据仓库中的数据是按照一定的主题域进行组织。

    - 集成:指对原有分散的数据库数据经过系统加工, 整理得到的消除源数据中的不一致性。

    - 相对稳定:指一旦某个数据进入数据仓库以后只需要定期的加载、刷新。

    - 反映历史变化:指通过这些信息,对企业的发展历程和未来趋势做出定量分析预测。

- 数据仓库建设是一个工程,是一个过程,而不是一种可以购买的产品。企业数据处理方式是以联机事务处理形式信息,并利用信息进行决策;在信息应用过程中管理信息。

- 数据仓库的出现,并不是要取代数据库。目前,大部分数据仓库还是用关系数据库管理系统来管理的。

- 数据仓库与数据库的主要区别在于:

    - 数据库是面向事务的设计,数据仓库是面向主题设计的。

    - 数据库一般存储在线交易数据,数据仓库存储的一般是历史数据。

    - 数据库设计是尽量避免冗余,数据仓库在设计是有意引入冗余。

    - 数据库是为捕获数据而设计,数据仓库是为分析数据而设计。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值