數(shù)據(jù)倉庫工具Hive實踐

數(shù)據(jù)倉庫工具Hive實踐

官網(wǎng)命令鏈接:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Select

一、DDL庫操作

數(shù)據(jù)定義語言 Data Definition Language

(一)針對庫

創(chuàng)建庫昼扛、查看庫寸齐、刪除庫、修改庫抄谐、切換庫

    1渺鹦、創(chuàng)建庫
        create database myhive;
        create database if not exists myhive;
    
    CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
    小括號表示必選,小括號中間的豎線表示或者蛹含,中括號表示可選毅厚。
        create database myhive_1 comment "myhive_1 database 1" location "/myhive_1";
        # location是HDFS的目錄
    2、查看庫
        show databases;//查看所有的庫
        desc  database  [extended]  myhive_1; //顯示數(shù)據(jù)庫的詳細屬性信息 
        select current_database();//查看當前使用的庫
    3浦箱、刪除庫
        默認:
        drop database myhive_1; 等價于     drop database myhive_1 RESTRICT;
        drop database if exists myhive_1; 
        drop database myhive_1 cascade;//強制級聯(lián)刪除吸耿,慎用!慎用酷窥!慎用咽安!
    4、修改庫
        不同版本可以使用的功能不同
        不常用E钔啤妆棒!
    5、切換庫
        use myhive;     
(二)針對表

創(chuàng)建表、刪除表糕珊、修改表动分、查看表、查看某張表的詳細信息红选。

    1澜公、查看表
        show tables;
        show tables in myhive;//在當前庫查看另外一個庫的表的信息
        show tables "stu*"; //正則匹配表名查詢
    2、查看某張表的詳細信息
        desc student;
        desc formatted student;    //查看表的格式化了之后的詳細信息
        desc extended student;    //查看表的詳細信息
        show create table student_ptn;     //查看建表完整語法
        show partitions student_ptn;          //查看分區(qū)

相關(guān)名詞解釋

CREATE TABLE創(chuàng)建一個指定名字的表纠脾。

EXTERNAL關(guān)鍵字可以讓用戶創(chuàng)建一個外部表玛瘸。在刪除表的時候,內(nèi)部表的元數(shù)據(jù)和數(shù)據(jù)會被一起刪除苟蹈,而外部表只刪除元數(shù)據(jù)糊渊,不刪除數(shù)據(jù)。

PARTITIONED BY在 Hive Select 查詢中一般會掃描整個表內(nèi)容慧脱,會消耗很多時間做沒必要 的工作渺绒。 有時候只需要掃描表中關(guān)心的一部分數(shù)據(jù),因此建表時引入 partition 概念菱鸥。

LIKE允許用戶復制現(xiàn)有的表結(jié)構(gòu)宗兼,但是不復制數(shù)據(jù)。

COMMENT可以為表與字段增加描述氮采。

ROW FORMAT用戶在建表的時候可以自定義 SerDe 或者使用自帶的 SerDe殷绍。如果沒有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,將會使用自帶的 SerDe鹊漠。

STORED AS TEXTFILE | SEQUENCEFILE | RCFILE : 如果文件數(shù)據(jù)是純文本主到,可以使用 STORED AS TEXTFILE,默認也是 textFile 格式躯概,可以通過執(zhí)行 命令 set hive.default.?leformat登钥,進行查看,如果數(shù)據(jù)需要壓縮娶靡,使用 STORED AS SEQUENCEFILE牧牢。 RCFILE 是一種行列存儲相結(jié)合的存儲方式。

CLUSTERED BY:對于每一個表(table)或者分區(qū)姿锭,Hive 可以進一步組織成桶塔鳍,也就是說桶是更為細粒 度的數(shù)據(jù)范圍劃分。Hive 也是針對某一列進行桶的組織呻此。Hive 采用對列值哈希轮纫,然后 除以桶的個數(shù)求 余的方式?jīng)Q定該條記錄存放在哪個桶當中。

LOCATION指定數(shù)據(jù)文件存放的 HDFS 目錄趾诗,不管內(nèi)部表還是外表,都可以指定。不指定就在默認的 倉庫路徑恃泪。

    3郑兴、創(chuàng)建表
        
        分桶表
        示例:CLUSTERED BY department SORTED BY age ASC,id DESC INTO 3 BUCKETS
        
        Create Table ... As Select  簡稱CTAS
        
        create table studentss like student; //復制表結(jié)構(gòu),不是復制數(shù)據(jù) 
        創(chuàng)建表的類型有6種:
        (1)創(chuàng)建內(nèi)部表
        create table student(id int, name string, sex string, age int, department string) row format delimited fields terminated by ",";
            
            內(nèi)部表的類型:MANAGED_TABLE
            
        (2)創(chuàng)建外部表
        create external table student_ext_1(id int, name string, sex string, age int, department string) row format delimited fields terminated by ",";

        內(nèi)部表和外部表的對比:
            1贝乎、在創(chuàng)建表的時候指定關(guān)鍵字: external
            2情连、一般來說,創(chuàng)建外部表览效,都需要指定一個外部路徑  
        內(nèi)部表和外部表的區(qū)別:
            刪除表的時候却舀,內(nèi)部表會都刪除,外部表只刪除元數(shù)據(jù)
        到底選擇內(nèi)部表還是外部表锤灿?
            1挽拔、如果數(shù)據(jù)已經(jīng)存儲在HDFS上面了,需要使用hive去進行分析但校,并且這份數(shù)據(jù)還有可能使用其他的計算引擎來執(zhí)行分析螃诅,使用外部表
            2、如果這個一份數(shù)據(jù)只是hive做數(shù)據(jù)分析使用状囱,就可以使用內(nèi)部表
        
        // 指定一個不存在的外部路徑: 創(chuàng)建表的時候术裸,會自動給你創(chuàng)建表目錄
        create external table student_ext_2(id int, name string, sex string, age int, department string) row format delimited fields terminated by "," location "/student_ext_2";

        // 指定一個已經(jīng)存在的目錄: 并且有數(shù)據(jù)
        //在linux中執(zhí)行
        //hadoop fs -mkdir -p /student_ext_3
        //hadoop fs -put /home/bigdata/data/student.txt /student_ext_3
        //在hive命令行中執(zhí)行
        create external table student_ext_3(id int, name string, sex string, age int, department string) row format delimited fields terminated by "," location "/student_ext_3";
        
        
        (3)創(chuàng)建分區(qū)表
        
        // 創(chuàng)建只有一個分區(qū)字段的分區(qū)表:
        create table student_ptn(id int, name string, sex string, age int, department string) partitioned by (city string comment "partitioned field") row format delimited fields terminated by ",";

        load data local inpath "/home/bigdata/data/student.txt" into table student_ptn;  //錯誤XXXXXX

        // 把數(shù)據(jù)導入到一個不存在的分區(qū),它會自動創(chuàng)建該分區(qū)
        load data local inpath "/home/bigdata/data/student.txt" into table student_ptn partition(city="beijing");  //正確√√√√√√

        注意:partitioned里的字段不能是表中聲明的字段
        分區(qū)字段是虛擬列亭枷,它的值是存儲在元數(shù)據(jù)庫中袭艺,不是存儲在數(shù)據(jù)文件中。
        分區(qū)字段的使用和普通字段沒有區(qū)別

        // 把數(shù)據(jù)導入到一個已經(jīng)存在的分區(qū)
        alter table student_ptn add partition (city="chongqing"); //沒有變化
        load data local inpath "/home/bigdata/data/student.txt" into table student_ptn partition(city="chongqing"); //數(shù)據(jù)翻倍
                

        // 創(chuàng)建有多個分區(qū)字段的分區(qū)表:
        create table student_ptn_date(id int, name string, sex string, age int, department string) partitioned by (city string comment "partitioned field", dt string) row format delimited fields terminated by ",";

        // 往分區(qū)中導入數(shù)據(jù):
        load data local inpath "/home/bigdata/data/student.txt" into table student_ptn_date partition(city="beijing");  //錯誤XXXXXX

        load data local inpath "/home/bigdata/data/student.txt" into table student_ptn_date partition(city="beijing", dt='2012-12-12');     //正確√√√√√√

        // 不能在導入數(shù)據(jù)的時候指定多個分區(qū)定義
        load data local inpath "/home/bigdata/data/student.txt" into table student_ptn_date partition(city="beijing", dt='2012-12-14') partition(city="beijing" , dt='2012-12-13');   //錯誤XXXXXX

        // 添加分區(qū)
        alter table student_ptn_date add partition(city="beijing", dt='2012-12-14') partition (city="beijing" , dt='2012-12-13');     //正確√√√√√√
        alter table student_ptn_date add partition(city="chongqing", dt='2012-12-14') partition (city="chongqing" , dt='2012-12-13'); 

        // 查詢一個分區(qū)表有那些分區(qū)
        show partitions student_ptn;
        show partitions student_ptn_date;
        show partitions student; //報錯
        
        (4)創(chuàng)建分桶表
        
        // 創(chuàng)建一個分桶表
        create table student_bucket (id int, name string, sex string, age int, department string) clustered by (department) sorted by (age desc, id asc) into 3 buckets row format delimited fields terminated by ",";

        //desc formatted student_bucket;
        //Num Buckets:          3                        
        //Bucket Columns:       [department]             
        //Sort Columns:         [Order(col:age, order:0), Order(col:id, order:1)]   

        注意:clustered里的字段必須要是表字段中出現(xiàn)的字段
        分桶字段和排序字段可以不一樣叨粘,分桶字段和排序字段都必須是表字段中的一部分

        你往分通表里面導入數(shù)據(jù)要通過分桶查詢方式進行導入數(shù)據(jù)猾编。
        
        
        (5)從查詢語句的結(jié)果創(chuàng)建新表
        //通過下面的命令:
        create table ... as  select ....
        //查詢例子:
        select department, count(*) as total from student group by department;
        //完整的CTAS語句:
        create table dpt_count as select department, count(*) as total from student group by department;
                        
        (6)通過like復制已有表的結(jié)構(gòu)創(chuàng)建新表
        create table student_like like student;
    4、刪除表
    drop table student;
    drop table if exists student;   
    5宣鄙、修改表
        
        1)修改表名
        alter table student_like rename to studentss;

        2)修改字段

            添加字段: 
            alter table student2 add columns (city string, dt string);
            刪除字段: 
            alter table student2 drop columns (city);   //報錯XXXXXX
            替換字段:
            alter table student2 replace columns (id int, name string, sex string, age int);
            改變列的定義:
            alter table student2 change id newid string comment "new id";
            改變列的順序:
            alter table student2 change sex sex string first;
            alter table student2 change name name string after sex;

        3)修改分區(qū)

            添加分區(qū):
            alter table student_ptn add partition(city='tiajin') partition(city='shanghai');

            刪除分區(qū):
            alter table student_ptn drop partition(city='tiajin');  
            alter table student_ptn drop partition(city='tiajin'),partition(city='shanghai'); 

            修改分區(qū)的數(shù)據(jù)目錄:
            alter table student_ptn partition(city="beijing") set location "/stu_beijing";   //報錯XXXXXX
            alter table student_ptn partition(city="beijing") set location "hdfs://bigdata02:8020/stu_beijing";  //正確√√√√√√
    
    6袍镀、清空表
    truncate table student;//清空表只是清空該表的所有數(shù)據(jù)文件
    hadoop fs -rm -r /user/hive/warehouse/myhive.db/student/*       

三、DML操作

數(shù)據(jù)操縱語言 Data Manipulation Language

    1冻晤、導入數(shù)據(jù)
    LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
    (1)LOAD操作是復制或者移動操作苇羡,將數(shù)據(jù)文件復制或移動到Hive設置的路徑上。
    寫LOCAL的是復制鼻弧,不寫LOCAL是移動
    //導入本地絕對路徑數(shù)據(jù):
    load data local inpath "/home/bigdata/data/student.txt" into table student;

    //導入本地相對路徑的數(shù)據(jù):
    load data local inpath "./student.txt" into table student;
    load data local inpath './student.txt' overwrite into table student;
    (覆蓋導入)

     導入本地數(shù)據(jù)设江,相當于復制或者上傳

    //導入HDFS上的簡便路徑數(shù)據(jù):
    // hadoop fs -put /home/bigdata/data/student.txt /
    load data inpath '/student.txt' into table student;

    //導入HDFS上的全路徑模式下的數(shù)據(jù):
    load data inpath 'hdfs://bigdata02:9000/student.txt' into table student;

    導入HDFS上的數(shù)據(jù)到hive表,表示截切攘轩,移動

    insert
    insert into table student (id, name, sex, age, department) values (101,"huangbo","M",222,"IT");
    
    創(chuàng)建分區(qū)表:

    create table student_ptn (id int, name string, sex string, age int) partitioned by (department string) row format delimited fields terminated by ",";


    單重插入:
    insert into table student_ptn partition (department = 'IS') select id,sex,name,age from student where department  = 'IS';
    insert into table student_ptn partition (department = 'CS') select id,sex,name,age from student where department  = 'CS';
    insert into table student_ptn partition (department = 'MA') select id,sex,name,age from student where department  = 'MA';


    多重插入:
    from student 
    insert into table student_ptn partition (department = 'IS') select id,sex,name,age where department = 'IS' 
    insert into table student_ptn partition (department = 'CS') select id,sex,name,age where department = 'CS' 
    insert into table student_ptn partition (department = 'MA') select id,sex,name,age where department = 'MA' 
    
    多重插入最大的好處就是給很多結(jié)構(gòu)相同的SQL語句組合在一起提高所有的HQL的執(zhí)行效率叉存,翻譯成的MapReduce只需要讀取一次數(shù)據(jù)就搞定了。

        分區(qū)插入:
    需要手動的創(chuàng)建分區(qū)
    alter table student add partition (city="zhengzhou")
    load data local inpath '/student.txt' into table student partition(city='zhengzhou');


    CTAS(create table ... as select ...)(直接把查詢出來的結(jié)果存儲到新建的一張表里)
    內(nèi)部表/內(nèi)建表
    create table student as select id,name,age,department from mingxing;
    注意:自動新建的表中的字段和查詢語句出現(xiàn)的字段的名稱度帮,類型歼捏,注釋一模一樣

    限制:
    1稿存、不能創(chuàng)建外部表
    2、不能創(chuàng)建分區(qū)表
    3瞳秽、不能創(chuàng)建分桶表

    分桶插入:
    創(chuàng)建分桶表:
    create table mingxing(id int, name string, sex string, age int, department string)
    clustered by(id) sorted by(age desc) into 4 buckets
    row format delimited fields terminated by ',';

    //不能使用load方式直接往分桶表中導入數(shù)據(jù)
    插入數(shù)據(jù):
    insert into table mingxing select id,name,sex,age,department from mingxing2
    distribute by id sort by age desc;
    注意:查詢語句中的分桶信息必須和分桶表中的信息一致

    2瓣履、導出數(shù)據(jù)
    單模式導出數(shù)據(jù)到本地:
    insert overwrite local directory '/root/outputdata' select id,name,sex,age,department from mingxing;

    多模式導出數(shù)據(jù)到本地:
    from mingxing
    insert overwrite local directory '/root/outputdata1' select id, name
    insert overwrite local directory '/root/outputdata2' select id, name,age

    簡便路徑模式導出到hdfs:
    insert overwrite directory '/root/outputdata' select id,name,sex,age,department from mingxing;

    全路徑模式查詢數(shù)據(jù)到hdfs:
    insert overwrite directory 'hdfs://bigdata02:9000/root/outputdata1' select id,name,sex,age,department from mingxing;

    local :導出到本地目錄
    overwrite :表示覆蓋
    3、查詢數(shù)據(jù)
     Hive 中的 SELECT 基礎(chǔ)語法和標準 SQL 語法基本一致练俐,支持 WHERE袖迎、DISTINCT、GROUP BY腺晾、 ORDER BY燕锥、HAVING、LIMIT悯蝉、子查詢等

    order by : 全局排序
    sort by :局部排序
    一般來說归形,要搭配 分桶操作使用
    distribute by id sort by age desc;
    
    distribute by : 純粹就是分桶
    在使用distribute by的時候:要設置reduceTask的個數(shù)

    cluster by : 既分桶,也排序
    cluster by age = distribute by age sort by age;
    
    cluster by 和 sort by 不能同時使用

    where , group by, distinct ,having ,  case...when, ....

四泉粉、Hive視圖

和關(guān)系型數(shù)據(jù)庫一樣连霉,Hive 也提供了視圖的功能,不過請注意嗡靡,Hive 的視圖和關(guān)系型數(shù)據(jù)庫的數(shù)據(jù)還 是有很大的區(qū)別:

1跺撼、只有邏輯視圖,沒有物理視圖讨彼;
2歉井、視圖只能查詢,不能 Load/Insert/Update/Delete 數(shù)據(jù)哈误;
3哩至、視圖在創(chuàng)建時候,只是保存了一份元數(shù)據(jù)蜜自,當查詢視圖的時候菩貌,才開始執(zhí)行視圖對應的那些子查詢 。

1重荠、創(chuàng)建視圖 
    create view view_name as select * from carss; create view carss_view as select * from carss limit 500; 

2箭阶、查看視圖
    show tables;   // 可以查看表,也可以查看視圖 
    desc view_name  // 查看某個具體視圖的信息 
    desc carss_view 

3戈鲁、刪除視圖 
    drop view view_name drop view if exists carss_view 

4仇参、使用視圖 
    create view sogou_view as select * from sogou_table where rank > 3 ; 
    select count(distinct uid) from sogou_vi
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市婆殿,隨后出現(xiàn)的幾起案子诈乒,更是在濱河造成了極大的恐慌,老刑警劉巖婆芦,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怕磨,死亡現(xiàn)場離奇詭異喂饥,居然都是意外死亡,警方通過查閱死者的電腦和手機肠鲫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門仰泻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人滩届,你說我怎么就攤上這事”惶洌” “怎么了帜消?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長浓体。 經(jīng)常有香客問我泡挺,道長,這世上最難降的妖魔是什么命浴? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任娄猫,我火速辦了婚禮,結(jié)果婚禮上生闲,老公的妹妹穿的比我還像新娘媳溺。我一直安慰自己,他們只是感情好碍讯,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布悬蔽。 她就那樣靜靜地躺著,像睡著了一般捉兴。 火紅的嫁衣襯著肌膚如雪蝎困。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天倍啥,我揣著相機與錄音禾乘,去河邊找鬼。 笑死虽缕,一個胖子當著我的面吹牛始藕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播彼宠,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼鳄虱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了凭峡?” 一聲冷哼從身側(cè)響起拙已,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎摧冀,沒想到半個月后倍踪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體系宫,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年建车,在試婚紗的時候發(fā)現(xiàn)自己被綠了扩借。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡缤至,死狀恐怖潮罪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情领斥,我是刑警寧澤嫉到,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站月洛,受9級特大地震影響何恶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嚼黔,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一细层、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧唬涧,春花似錦疫赎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至钓株,卻和暖如春实牡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背轴合。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工创坞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人受葛。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓题涨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親总滩。 傳聞我的和親對象是個殘疾皇子纲堵,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344