淺談hive

談下一個新人對hive的理解,不喜勿噴。java

    hive是hadoop整個項目使用中最經常使用的輔助項目之一。數據庫

    hadoop基礎的組件有hdfs和mapreduce。hdfs完成整個hadoop集羣中數據的存儲,採用google的bigTable架構,其實我以爲就是將數據平分爲多份,而後平分給分佈式中的各機器上,存儲在上面的數據就像一個隱藏文件,你在本地硬盤上找不到它們,但卻能夠經過hadoop中hdfs指令顯示和操做它們,像hadoop dfs -ls 路徑。而mapreduce則是將存儲在集羣中的數據進行分佈式計算,由原來1臺電腦的工做放到集羣中全部電腦上,所以它的運算效率會有顯著的提升。服務器

    說完了hdfs和mapreduce,你應該對hadoop有個基本的瞭解了,我們再說下hive。架構

    hive是經過解析你所寫的HiveQL語句,來進行mapreduce計算,實現數據倉庫中分析數據的做用。hive其實就是針對mapreduce寫了一系列的方法和類,我們能夠經過寫HIVEQL的形式執行mapreduce.用hiveQL能實現的功能你都能在mapReduce中寫出來,若是你不閒麻煩的話。。。分佈式

    說下hive的主要功能:數據ETL(抽取、轉換、加載)工具、數據存儲和大型數據集的查詢和分析能力。工具

    hive包含了四種數據模型:表(Table)、外部表(External Table)、分區(Partition)、桶(bucket)。oop

    表和外部表我的感受用起來沒什麼區別, 有區別的地方只不過是外部表在建立的時候數據沒有移動到數據倉庫目錄中,也就是說外部表不是由它本身來管理。而刪除外部表的時候,只會刪除元數據,外部表內的數據不會被刪除。測試

    而分區和桶。。。就用分區。。不過度區和桶應該都是爲了優化hive的分析效率而作的架構,我原來放10號到20號的數據都放個一個文件中,如今,我經過分區,將10號到20號的每日數據存儲在以天爲單位的存儲文件中,這樣,我查詢某一天的數據時只是查詢這一天的文件,而不是查詢未分區前的整個文件,這樣,效率就上來了,固然,這只是個人理解,可能還有其它做用。。。優化

    我理解的hive的基本工做是:將metadata存到hive自建的表中,而後經過操做和分析hive表中的數據,獲得你想要的分析結果。google

    hive的元數據存儲有三種方式:

    1、Single User Mode.其實就是將metadata存儲在一個內存數據庫(derby)中。內存纔多大啊,因此平常中基本不用。

    2、Multi User Mode. 經過是鏈接本機的MySql,來獲取元數據。這是平常和工做中最經常使用的一種方式。。貌似是工做中。。

    3、Remote Server Mode .其實就是經過本機的thrift協議訪問另外一個服務器上的metaStoreServcer,metadata不在本地。

    關於hive配置,很少說了,網上一堆。。。

   關於hive中表的操做,我說下容易讓人誤會的地方:

    hive雖然有表的概念,但它是一個離線數據分析工具,建表只是爲了分析服務的,而分析的數據你不可能一條一條插入進去,或者刪幾條。。而它的正常使用方式是將metadata導入到hive表中,再經過hiveQL分析hive表中的數據。因此hive中不提供手動插入一條或幾條數據。有手動就得有自動,自動我舉個例子:insert overwrite table abc select * from bbc;這就是我認爲的自動。。。。不能手動增長數據了,只能導入數據或自動添加數據。那麼刪除和修改呢,妥妥的也不能。

    關於hive語句的介紹也很少說了,網上也一堆,說的都挺清楚明白的。不過,這裏我還得舉個例子,關於我今天寫的一個,煩了我一天的mapjoin...

     mapjoin 有兩個好處:1.關聯的兩張表中有一個表很是小時,mapjoin能夠將小表中的數據加載到內存中,而後在map階段會自動大表中的數據,效率還不錯。like :select /*+ mapjoin*/ a.id,a,username from a join b on (a.id=b.id)。這是在對等的狀況下,效率至關不錯。

                          2.還有一個好處就是它能夠實現不對等鏈接。。 join ..on  ()  ,on 後面會跟對等的條件,像a.id=b.id ,你若是跟個like 會報錯。而mapjoin能夠實現不對等條件,就是在join後面不用on了,直接用where,不過這個效率,試了下,我的感受效率不高。。like :select /*+ mapjoin*/ a.id,a,username from a join b where a.username like 'error')。

            關於hive其它的方面我尚未看。。等之後看完了,再談下感覺吧。。

 

    PS: 關於mapjoin()的非等值測試:

    兩張表:pv_temp_test1(大表)  ,title_keyword_test(小表)

             pv_temp_test1:  530180 條 

             title_keyword_test  5646 條

  測試語句 :

hive> insert overwrite table hbase_test_keyword 
select /*+ mapjoin(a)*/ a.keyword,b.dt,b.pid,b.area,count(*),count(distinct clientid) from title_keyword_test a join (select dt,pid,area,wd,clientid from pv_temp_test1 where wd!='' and wd != 'None') b where b.wd like concat('%',a.keyword,'%') group by  a.keyword,b.dt,b.area,b.pid;

   花費時間:4927秒......

PS:第一次寫博客。。想把本身下班以後的時間利用起來,寫了快2個小時,挺累,不喜勿怪。。。

相關文章
相關標籤/搜索