1. 程式人生 > >二十五、Hadoop學記筆記————Hive復習與深入

二十五、Hadoop學記筆記————Hive復習與深入

介紹 root creat mat 5.7 語法 路徑 文件復制 AS

Hive主要為了簡化MapReduce流程,使非編程人員也能進行數據的梳理,即直接使用sql語句代替MapReduce程序

Hive建表的時候元數據(表明,字段信息等)存於關系型數據庫中,數據存於HDFS中。

此元數據與HDFS中的元數據需要區分清楚,HDFS中元數據(文件名,文件長度等)存於Namenode中,數據存於Datanode中。

本次使用的是hive1.2.2版本

技術分享圖片

下載完畢之後解壓:

技術分享圖片

將default文件復制一份成site文件,然後打開site文件,清空其內容,然後配置如下參數:

技術分享圖片

hive.metastore.local表示元數據存於本地

其中jdbc的hive是mysql中,提供給hive的database的名稱,可自行修改,後續是登錄的賬號和密碼,可以使用root,也可以新建一個hive用戶,本機采用的是新建一個hive用戶。

之後將mysql的jdbc驅動放入hive的lib目錄下:

技術分享圖片

之後安裝mysql,並在mysql下create名為hive的數據庫,本機使用mysql5.7,數據庫安裝不做描述:

技術分享圖片

技術分享圖片

在hive中新建的表的表結構會在mysql中相應的databse內存儲:

技術分享圖片

技術分享圖片

技術分享圖片

之後在例舉一個復雜點的數據表,主要包含了數組型字段和map型字段,並且附帶partition分區,例子來源於hive官網:

CREATE TABLE user_info(

id INT,
name STRING,
hobby ARRAY < STRING >,
goodatlol MAP < STRING, STRING >
)
PARTITIONED BY(dt STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘\t‘
COLLECTION ITEMS TERMINATED BY ‘,‘
MAP KEYS TERMINATED BY ‘:‘
STORED AS TEXTFILE;

先新建一個user_info表:

技術分享圖片

其中hobby為數組型字段,goodatlol為map型字段。fields的分隔符‘\t‘表示文件每一行的分隔符,collection的分隔符‘,‘表示數組型字段的分隔符,map的分隔符‘:‘表示map字段的分隔符。

這時候在hdfs的該路徑下回出現一個文件夾user_info:

技術分享圖片

由此可見,hive中的數據表,表結構的元數據存在所連接的關系型數據庫中,而數據信息存於hdfs。

之後錄入信息,新建文件,名字不限,內容如下:

技術分享圖片

load data local inpath ‘/home/tyx/temp/userinfo‘ into table user_info;

技術分享圖片

可用查詢語句得出ttt同學喜歡上單風男:

技術分享圖片

之後在hdfs的user_info路徑下還會出現分區:

技術分享圖片

前面講述的是建表和查詢,現在說一個插入比較常用的方法,由於Hive是數據倉庫,主要作用是用來存放、查詢和統計數據,因此插入一般是直接覆蓋,而不會像Mysql那樣經常一條一條的插入。在Hive中,Insert into默認是關閉的,需要做一些配置才能開啟,感興趣的朋友可以自行查詢,此處只介紹insert overwrite方法,標準語法如下(源自官方文檔):

INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] select_statement1 FROM from_statement;

意思就是從一個語句中讀取所有數據並覆蓋原數據。前面也提到Hive一般用來做統計查詢,通常情況下統計所需要的字段可能分布在好幾張數據表上。就算只存在於一張數據表,那統計所需要的字段也只有2到3個,新建一個表專門用來查詢也可以提高查詢效率。

新建一個user_test表:

技術分享圖片

這個表相較於user_info表沒有goodatlol字段和partition分區。

然後使用insert overwrite語句,將user_info中的id,name和hobby插入到user_test中來。

技術分享圖片

可以看到這時user_info中的name為ttt和zzz的數據都已經插入到了表user_info中,這時在該表中進行統計查詢效率會比在user_info中快。

該語句在下面場景會非常實用,比如一個表A很很多字段,其中1號程序員需要用到A中的1、2、3字段做統計分析,程序員2號需要用到A中的3、6、8字段做統計分析,那麽1號和2號分別都鍵自己的統計表會更加有效率

二十五、Hadoop學記筆記————Hive復習與深入