什么是Hive?
Hive是一种构建数据仓库的工具。里面有表的概念。
在Mysql里从表中插入的数据,会放在磁盘上。再打开这个表的时候,会把磁盘上的数据规整到一个表格里显示。
但是计算机不会自己规整成表格,所以在Hive中需要一份元数据
这份元数据包括:
元数据(
行的分隔符(这样在映射成表的时候知道能映射成几行)
字段分隔符(这样在映射成表的时候知道能映射成几列)
字段的类型
字段的名称
)
Hive内部也是有表的概念,Hive把数据存储到HDFS上。
它的元数据存到了本地的轻量级的数据库中。
Hive依赖于HDFS和MapReduce,可以看成是分布式的大表,也支持使用SQL语句进行数据的处理。
Hive原理
1.客户端传一条SQL语句给Hive(Hive支持所有的SQL标准)
2.Hive对SQL进行解析,优化SQL,策略选择器,消耗模型(看下哪种计划是最好的,看下消耗时间),把一个个的SQL解析成一个个MapReduce。(解析器,编译器,优化器)
3.MR计算的数据在HDFS上。MR处理HDFS上的数据。
效率问题:封装的越高层,效率越低
-
Hive做了什么事情
-
通过SQL语句解析成MapReduce这个过程是Hive做的。
其它的事情是它指挥别人来做的。
Hive中表的类型
内部表(受控表):受Hive控制。删除内部表的时候,HDFS上的数据及元数据都会被删除。
外部表:删除外部表的时候,HDFS上的数据不会被删除但是元数据会被删除。
临时表(测试):在当前会话期间内存在,会话结束自动消失。生命周期随着session
分区表:将一批数据分成多个目录来存储
为什么创建分区表?
防止暴力扫描全表,需要一个分区表来提高查询效率
往分区中添加数据有四种方式:
(1)insert 指定分区
(2)load data 指定分区
(3)查询已有表的数据,insert到新表中
from day_hour_table insert into table newt partition(dt=01,hour=9898) select id,content
(4)alter table add partition创建空分区,然后使用HDFS命令往空分区目录中上传数据
(5)创建分区,并且指定分区数据的位置
分桶表:取模存储
为什么创建分桶表?
思想:引例找两个文件的url—将url装成hashcode取模,转成小文件,比对小文件
。
比如,有两个表如上。要找所有用户的订单数,就要进行join。
join底层的原理:先搞一个笛卡尔积。遍历右表n次,效率很慢。
分桶:
把用户信息表存储的时候,根据ID(哈希值)与number(分成小文件的个数)取模,分成多个表来存。
订单表也同样根据ID(哈希值)与number(分成小文件的个数)取模,分成多个表来存。
对应的表两两join就可以完成。