hive的数据组织格式和基本操作

hive的数据组织格式:
    库:
        管理数据
        不同模块的数据最好放在不同的数据库中
        同mysql中的数据库的概念
    表:
        内部表:管理表/managed_table
            表的创建   表的数据的删除  都是有hive自己决定的
            同mysql中的表
            内部表在进行删除的时候 元数据和原始数据都会被删除
        外部表:external_table
            和内部表对立面,一个表不可能同时是内部表又是外部表的
            表结构上同内部表
            数据自己决定不了
            外部表在进行删除的时候  只能删除元数据(描述信息),表的原始数据(hdfs)不会被删除
            
        
        分区表:
            这里的分区的概念不同于MR中的分区的概念
            hive中有可能一个表非常大,查询的时候会进行全表扫描,极大的降低hive表的查询性能
            这时候就出现了分区表
                将原来的一个大的表存储的时候分成不同的数据目录进行存储
                    没有分区的表存储:
                    /user/hive/warehouse/test.db/test01/  test01表对应所有的原始数据存储目录
                    在进行查询的时候是对上面的整个目录下的所有的数据进行扫描
                    有分区的表:分区字段
                        查询的时候  按照课程进行过滤查询  按照课程进行分区
                        /user/hive/warehouse/test.db/test01/course=math/
                        /user/hive/warehouse/test.db/test01/course=en/
                        /user/hive/warehouse/test.db/test01/course=computer/
                        按照不同的课程  存储在不同的目录下
                        查询的时候  只会扫描某一个分区的数据  不会全表的扫描了
                        减少扫描范围  提升查询性能
                        实际生产中  最常用的分区字段 时间字段                        
        分桶表:
            类似于mapreduce中的分区的概念
            同一个表的数据  存储在同一个目录下不同的文件中
            指定分桶的个数  桶的个数----mapreduce的中reducetask的个数  3
            /user/hive/warehouse/test.db/test01/part-r-00000
            /user/hive/warehouse/test.db/test01/part-r-00001
            /user/hive/warehouse/test.db/test01/part-r-00002
            
            作用:
            1)提升join的性能
                面试题2
            2)提升抽样的性能   数据具有代表性   散列
            
                
    视图:
        view
        hive中的视图  只有逻辑视图(存储的仅仅是一个sql语句  不会进行执行的)  没有物化视图(将视图代表的sql进行执行结果)
        查询视图的时候才会进行执行
        hive中的视图类似于sql语句的快捷方式   保存的是当前的视图代表的sql语句
        
    数据存储:
        原始数据:hdfs上
            默认情况下存储在hdfs的:
            /user/hive/warehouse
                            /....db   代表的是数据库
                                  /test01   代表的是当前数据库下的表  这个目录下存储就是表中的数据
            这个目录可以自定义配置:
                hive-site.xml
                <property>
                <name>hive.metastore.warehouse.dir</name>
                <value>/user/hive/hivehome</value>
                <description>hive的原始数据在hdfs的存储目录</description>
                </property>
        元数据:mysql中存储
            <property>
            <name>javax.jdo.option.ConnectionURL</name>
            <value>jdbc:mysql://localhost:3306/myhive?createDatabaseIfNotExist=true</value>
            <description>JDBC connect string for a JDBC metastore</description>
            <!-- 如果 mysql 和 hive 在同一个服务器节点,那么请更改 hadoop02 为 localhost -->
            </property>
            mysql中的myhive库:
                数据库的描述信息表:
                DBS:描述hive中的数据库信息的
                    库的存储位置                                            
                    hdfs://hadoop01:9000/user/hive/hivehome/test_home.db    6    test_home    hadoop    USER
                    在hive表创建一个数据库在这个表中添加一条数据
                TBLS:描述hive中的表的信息的
                    TBL_TYPE:描述表的类型的
                    hive中创建一个表的时候 这个表中添加一条数据
                COLUMNS_V2:描述字段信息的
                    表id    字段名    字段类型 字段顺序(从0开始 数字越大 证明字段越在后)
                    1        name    string    1
                    元数据修改的时候  发现hive中的表的字段顺序变了
                    说明hive表的结构从元数据表加载来的  原始数据从hdfs加载来的
                    修改元数据  修改表结构
                    
                    
                    
hive初体验:
    create database test_bd1807;
    use test_bd1807;
    建表:
    1       0       家电
    create table jiadian(id int,father_id int,name string) 
    row format delimited fields terminated by "\t";
    加载数据:
    load data local inpath '/home/hadoop/fur.txt' into table jiadian;
    查询:
    select * from jiadian;
    row format delimited  行格式化分割符
        列之间的分割符 fields terminated by ''
        行分隔符:lines terminated by '\n'
    
hive的ddl操作:data-define-language
    数据库的操作:
        建库:
            create database if not exists test;
        切换数据库:
            use test;
        查看正在使用的数据库:
            select current_database();
        查看数据库列表:
            show databases;
            show databases like 'test*';
        查看数据库的详细描述信息:
            desc database test;----DBS
        删除库:
            drop database if exists test;  只能删除空的数据库
            drop database test restrict;  .   restrict
            drop database test cascade;   强制删除非空数据库
        修改数据库:
            不支持
        为了避免报错:
            创建的时候加if not exists
            删除:if exists
            同样适用于表操作
    表的操作:
        1.显示表列表:
            show tables;
            show tables like 'test*';
            show tables in test_home;   查看指定数据库下的表
        2.查看表的详细信息:
            desc test01;  可以查看表的字段描述信息
            desc extended test01;  查看表的详细信息
            desc formatted test01;  格式化显示表的详细信息
        3.删除表
            drop table test01;
        4.清空表
            清空表中的数据  表结构保存
            truncate table test01;

猜你喜欢

转载自blog.csdn.net/wjr_wl/article/details/83151133