库
:
同mysql中的数据库
将数据进行细化管理 不同业务模块的数据放在一个数据库中
分库 分表
hive中不同的模块的数据一般要放在不同的数据库中的
便于数据管理
表 :
**hive数据的管理权限分:**
**内部表**:
管理权限是hive自己 hive对表中的数据(原始数据)有绝对的增删权限的
内部表在进行删除表的时候 表中的数据(hdfs对应的目录)会被删除的 元数据会被删除
**外部表**
外部表更像一个hdfs的数据使用者,使用的数据管理权限hdfs自己管理,hive来说只有使用权限的
外部表在进行删除表的时候 元数据会被删除 表中的数据(hdfs) hdfs对应的数据不会被删除的
总结: 内部 表和外部表最本质的一个区别 删除表的时候 外部表的数据不会被删除 内部表的数据会被删除
内部表 或 外部表 删除表的时候 元数据都会被删除
功能:
分区表
一个表中的数据很多 1T 的数据 user (id,name,address,age,sex)
在这个表中 查询age=18的人
sql:
select * from user where age=18;
如果所有数据全部存储在一个普通表中,执行上面的语句的时候,全表扫描 才能得到我们最终想要的结果 最终执行效率很低
如何提升查询性能: 缩小查询范围
从数据存储开始入手
按照年龄将我们的数据分成不同的‘小 表’存储
/user
/age=18
/age=17
/age=16
/age=34
.......
不同表中存储的就是 不同年龄的数据
这个时候 在进行执行
select * from user where age=18;
只会扫描
/user
/age=18 减少了扫描范围 提升了查询性能
上面的案例中 每一个年龄对应的一个“小表”称为一个分区
user表被分成了很多的分区 user表称为分区表
分区表: 减少了扫描范围 提升了查询性能
一般怎么样进行分区:
进行分区的时候 依据字段--- 分区字段
分区字段:一般是过滤的条件字段 经常用于过滤的字段
select * from user where address="河南" and sex="男";
分区字段: address+ sex
/address /sex
select * from user where age=20; 全表扫描
**分区表的存储:**
普通表数据的存储:
hdfs: /user/hive/warehouse/数据库/表/数据文件
分区表:不同目录
hdfs: /user/hive/warehouse/数据库/表/age=18/
/user/hive/warehouse/数据库/表/age=19/
/user/hive/warehouse/数据库/表/age=20/
分桶表:
mapreduce -- 分区的概念
两个表 a (id name) 10T b(id age) 1T
进行两表关联:
select * from a join b on a.id=b.id;
将这两个表进行分区
分区字段:
id 唯一
分很多的分区 每一个分区中只有一条数据 没有意义的
**解决思路:
将两个表 都进行切分 按照统一的规则切分的**
每一切分的小文件 称为一个桶
这两个表 -- 分桶表
分桶依据 -- 分桶算法
关联建.hash % 分桶个数
最终相同的关联建 在两个表中的对应的桶一样的
作用:
1)为了提升关联查询的性能
关联的时候 两个表进行分桶个数 限制:
相同 或 倍数关系的
2)提升抽样查询的性能
抽样: 随机性
一个桶的数据 就可以认为一个抽样的样本数据
**分桶表的数据存储:
不同分桶表对应的是不同的文件**
/user
分桶 id 桶的个数 3
存储的时候:
/user/part-r-00000
/user/part-r-00001
/user/part-r-00002
视图:
一个视图代表的就是一个查询语句
craete view view_name as select ....
1)hive中的视图只存在逻辑视图 没有物化视图 仅仅将视图代表的sql语句保存下来了
物化视图: 将视图代表的sql查询语句 执行结果
2)视图在查询视图的时候开始真正实行视图代表的语句的
select * from view_name;
3)视图作用仅仅为了提升sql语句的可读性
select ...
from
select ..from
select ..from ....
select ...
from
select ..from
view_name
4)hive中的视图 不支持 insert delete update
数据存储文件
元数据 存储的hive的表的描述信息的
存储在关系型数据库中 默认derby中 改为 mysql中
jdbc:mysql://localhost:3306/bd1901?createDatabaseIfNotExist=true
元数据存储mysql bd1901中
hive表中: 数据库描述信息:
DBS:
2 hdfs://bd1901/user/hive/warehouse/test_1901.db test_1901 hadoop USER
hive每一个数据库的存储的hdfs位置 数据库的操作用户|角色
每当在hive中创建一个数据库 这个表中就会添加一条数据
表的描述信息:
TBLS
1 1558077151 2 0 hadoop 0 1 test01 MANAGED_TABLE 0
表的id 表的创建时间 表的所属用户 表所属数据库 表的类型(managed_table external_table virtual_view)
每当在hive中创建一个表 这个表中就会添加一条数据
表字段信息的描述:
columns_v2
描述的表的字段信息 每一个字段一行
表的字段名 类型 顺序 所属表
总结:
hive的元数据可以修改 一定要慎重修改
hive最终 的显示的表结构信息 全部读取mysql中的元数据来的
元数据一旦修改 表就够就会修改
表数据(原始数据)
存贮在hdfs的
默认存储路径:
/user/hive/warehouse/
默认的hive-default.xml
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
<description>location of default database for the warehouse</description>
</property>
可以修改的
在hive-site.xml 添加
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/myhive/warehouse</value>
<description>location of default database for the warehouse</description>
</property>
注意: 修改 只能改变以后的建表 以前的表该存储哪里就存在哪里