Hive學習系列三--語法學習

Hive語法學習sql

一、hive的表分爲外部表、分區表和桶shell

    a、外部表:Hive中的外部表和表很相似,可是其數據不是放在本身表所屬的目錄中,apache

    而是存放到別處,這樣的好處是若是你要刪除這個外部表,該外部表所指向的數據是oop

    不會被刪除的,它只會刪除外部表對應的元數據;而若是你要刪除表,該表對應的所學習

    有數據包括元數據都會被刪除。
 b、分區:在Hive中,表的每個分區對應表下的相應目錄,全部分區的數據都是存儲測試

    在對應的目錄中。好比wyp表有dt和city兩個分區,則對應dt=20131218,city=BJ對應表spa

    的目錄爲/user/hive/warehouse/dt=20131218/city=BJ,全部屬於這個分區的數據都存orm

    放在這個目錄中。
 c、桶:對指定的列計算其hash,根據hash值切分數據,目的是爲了並行,每個桶對排序

    應一個文件(注意和分區的區別)。好比將wyp表id列分散至16個桶中,首先對id列的hadoop

    值計算hash,對應hash值爲0和16的數據存儲的HDFS目錄

    爲:/user/hive/warehouse/wyp/part-00000;而hash值爲2的數據存儲的HDFS 目

    錄爲:/user/hive/warehouse/wyp/part-00002。

二、SORT BY 只在本機作排序,ORDER BY 全局排序,只有一個Reduce任務

三、Hive支持select查詢,

    a) Select * from user; 不執行mapreduce任務

    b) Select count(*) from user; 執行mapreduce任務

    c) Select * from user limit 2; 不執行mapreduce任務

    d) Select * from user sort by user_id desc limit 2; 執行mapreduce任務

    e) 正則列,未成功

    f) Select * from user where user_id=100636執行帶條件查詢報錯

       

        問題追蹤,發現是hive-1.1.1的問題https://issues.apache.org/jira/browse/HIVE-12872

        解決方法:將環境變量換成hive-1.2.0,又出現下面問題

        

            表名user在hive-1.2.0中比較特殊,從新創建表user_info後查詢成功。

        建表語句:

            Create table user_info(user_id int,cid string,ckid string,username string)

             Row format delimited fields terminated by ‘\t’ lines terminated by ‘\n’;

        加載數據:

                Load data local inpath ‘/opt/data.txt’ into table user_info;

    g) 將查詢結果輸出到本地目錄

            

            執行mapreduce任務

    h) 分組查詢(執行mapreduce任務)

                 

    i) 建立表(三個mapreduce任務)

            

    j) 將查詢結果輸入到另外一張表中(mapreduce任務數跟字段數相同)

            

    k) 插入失敗,查詢的列與表的列數不一樣

            

    l) 基於Partition的查詢

            i. 通常 SELECT 查詢會掃描整個表,使用 PARTITIONED BY 子句建表,查詢就

            能夠利用分區剪枝(input pruning)的特性

            ii. Hive 當前的實現是,只有分區斷言出如今離 FROM 子句最近的那個WHERE 

            子句中,纔會啓用分區剪枝

    m) 加載分區數據 

            i. load data local inpath '/home/hadoop/input/hive/partitions/file1' into table logs 

            partition (dt='2001-01-01',country='GB');

    n) Hive不支持update和delete語句,看下圖

            i. Update

                 

            ii. Delete

                 

    o) Hive中insert能夠編輯文件來導入數據,update和delete能夠重寫數據。

    p) Hive中聯合查詢(執行一個mapreduce任務)

         

    q) Join查詢時,須要注意幾個關鍵點

        i. 只支持等值join

            1. SELECT a.* FROM a JOIN b ON (a.id = b.id)

            2. SELECT a.* FROM a JOIN b 

                    ON (a.id = b.id AND a.department = b.department)

        ii. 能夠 join 多於 2 個表,例如

            SELECT a.val, b.val, c.val FROM a JOIN b 

                    ON (a.key = b.key1) JOIN c ON (c.key = b.key2)

        iii. 若是join中多個表的 join key 是同一個,則 join 會被轉化爲單個 map/reduce 任務

        iv. LEFT,RIGHT和FULL OUTER

            例子

                SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON (a.key=b.key)

        v. 若是你想限制 join 的輸出,應該在 WHERE 子句中寫過濾條件——或是在 join 子

            句中寫

            容易混淆的問題是表分區的狀況

                SELECT c.val, d.val FROM c LEFT OUTER JOIN d ON (c.key=d.key) 

                WHERE a.ds='2010-07-07' AND b.ds='2010-07-07‘

        vi. •若是 d 表中找不到對應 c 表的記錄,d 表的全部列都會列出 NULL,包括 ds 列。

            也就是說,join 會過濾 d 表中不能找到匹配 c 表 join key 的全部記錄。這樣的話,

            LEFT OUTER 就使得查詢結果與 WHERE 子句無關

            解決辦法

                SELECT c.val, d.val FROM c LEFT OUTER JOIN d 

                    ON (c.key=d.key AND d.ds='2009-07-07' AND c.ds='2009-07-07')

        vii. LEFT SEMI JOIN

            1. LEFT SEMI JOIN 的限制是, JOIN 子句中右邊的表只能在 ON 子句中設置過濾

            條件,在 WHERE 子句、SELECT 子句或其餘地方過濾都不行

    r) Hive不支持等值鏈接(測試hive-1.2.1支持)

        i. SQL中對兩表內聯能夠寫成:

            select * from dual a,dual b where a.key = b.key;

        ii. Hive中應爲

            select * from dual a join dual b on a.key = b.key; 

            而不是傳統的格式:

            SELECT t1.a1 as c1, t2.b1 as c2FROM t1, t2

            WHERE t1.a2 = t2.b2

                 

                

 

    s) 分號字符,hql是以分號結尾,可是,對分號的認識不是很智慧    

                

                 

        解決方法:用分號的ASCII碼代替

                

    t) Hive不支持將數據插入現有的表或分區中,(已測試)

            僅支持覆蓋重寫整個表

            Insert into overwrite table a select * from b;

    u) hive不支持INSERT INTO 表 Values(), UPDATE, DELETE操做(已測試)

    v) hive支持嵌入mapreduce程序,來處理複雜的邏輯

    w) hive支持將轉換後的數據直接寫入不一樣的表,還能寫入分區、hdfs和本地目錄

    x) Hive加載sql文本的方法

        i. ./hive  -f  ‘/opt/test’

            ./hive 進入hive shell,而後,source ‘/opt/test’

                

相關文章
相關標籤/搜索