1. 程式人生 > >hive的資料組織格式和基本操作

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;