hive的数据组织形式


同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>
            注意: 修改 只能改变以后的建表  以前的表该存储哪里就存在哪里
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值