在上篇《 hive(01)、基於hadoop集羣的數據倉庫Hive搭建實踐 》一文中咱們搭建了分佈式的數據倉庫Hive服務,本文主要是在上文的基礎上結合Hadoop分佈式文件系統,將結構化的數據文件映射爲一張數據庫表,將sql語句轉換爲MapReduce任務進行運行的具體實踐。Hive幫助無開發經驗的數據分析人員,有能力處理大數據還能夠構建標準化的MapReduce開發過程,所以咱們學習大數據就有必要學習下Hive了。sql
1.hadoop集羣環境shell
2.完整的Hive服務環境(鏈接了遠程元數據庫服務)數據庫
注:hadoop集羣或者hive服務沒有搭建,請從參考前面的文章緩存
1.啓動hadoop集羣分佈式
啓動hadoop三臺機器,而後在主節點機器上啓動hadoop集羣:start-all.shoop
2.啓動Hiveserver服務學習
在hive機器上啓動hiveserver服務:hive --service hiveserver2 或者hive --service hiveserver2 &測試
3.啓動Hive Metastore服務大數據
在hive機器上啓動Hive Metastore服務:hive --service metastore或者hive --service metastore & ui
看到以下信息,說明啓動完成:
4.驗證啓動
在終端輸入jps -ml查看:
能夠看到hadoop集羣個hive服務啓動都正常
1.啓動hive客戶端
在hive機器上啓動hiveserver服務:hive 或者hive shell
2.基本操做
<1>.建立表
在hive控制檯輸入腳本:
CREATE TABLE TB_USER(id int,name string,phone string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
<2>.正則匹配查找表
在hive控制檯輸入:show tables '*user*';
<3>.查看錶結構
在hive終端輸入:desc 表名
<4>.增刪表字段
咱們給tb_user表先增長一個email字段: ALTER TABLE tb_user ADD COLUMNS (email string);
<5>.表重命名
咱們將tb_user從新命名成tb_user_back表:ALTER TABLE tb_user RENAME TO tb_user_back;
<6>.刪除表
首先建立一個tb_user表,而後刪除tb_user_back表:DROP TABLE tb_user_back;
<7>.插入數據
Hive插入數據有如下幾種方式:
1>.從本地文件系統中導入數據到Hive表;
首先咱們從本地文件系統中導入數據到Hive的tb_user表中:
咱們在hive機器的home目錄下建立user.txt文件,內容以下
而後在hive終端執行:
LOAD DATA LOCAL INPATH '/home/user.txt' OVERWRITE INTO TABLE tb_user;
在HDFS中查看剛剛導入的數據:
2>.從HDFS上導入數據到Hive表;
建立表tb_user_hdfs,而後從hdfs上導入user.txt的數據
在HDFS中查看剛剛導入的數據:
3>.從別的表中查詢出相應的數據並導入到Hive表中;
建立表tb_user_end_tab,而後從tb_user表查詢導入數據
CREATE TABLE TB_USER_END_TAB(id int,name string,phone string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
INSERT OVERWRITE TABLE tb_user_end_tab SELECT * FROM tb_user;
4>.在建立表的時候經過從別的表中查詢出相應的記錄並插入到所建立的表中;
新建 tb_user_new_tab表並從tb_user表中導入數據
CREATE TABLE tb_user_new_tab AS SELECT * FROM tb_user;
CREATE TABLE tb_user_new_tab LIKE tb_user;這是隻克隆表結構不導數據
<8>.導出數據
1>.經過Hive導出到本地文件系統
INSERT OVERWRITE LOCAL DIRECTORY '/home/user' SELECT * FROM tb_user;
查看導出的數據:
2>.從hdfs中導出數據
參見《hadoop(02)、使用JAVA API對HDFS進行基本操做》中hdfs下載文件的操做
3.查詢操做
<1>.普通的條件、排序查詢
FROM (SELECT * FROM tb_user) A SELECT A.* WHERE A.ID>0 LIMIT 2;
FROM (SELECT * FROM tb_user) A SELECT A.* WHERE A.ID>0 LIMIT 3;
FROM (SELECT * FROM tb_user) A SELECT A.* WHERE A.ID>0 ORDER BY A.ID DESC LIMIT 2;
<2>.鏈接查詢
爲了測試咱們給tb_user表加入多幾條數據:
SELECT A.* FROM tb_user_hdfs A JOIN tb_user B ON A.ID=B.ID;
SELECT A.* FROM tb_user_hdfs A JOIN tb_user B ON A.ID=B.ID WHERE A.NAME='xiaoming';
<3>.聚合查詢
SELECT COUNT(DISTINCT ID) FROM tb_user;
<4>.分組查詢
SELECT ID,PHONE FROM tb_user GROUP BY ID,PHONE;
SELECT ID,PHONE FROM tb_user GROUP BY ID,PHONE HAVING ID>2;
4.視圖操做
hive也有對視圖的操做,下面咱們進行視圖的建立和刪除
quit,exit: 退出hive終端
reset: 重置配置爲默認值
set <key>=<value> : 修改特定變量的值
set : 輸出用戶覆蓋的hive配置變量
set -v : 輸出全部Hadoop和Hive的配置變量
add FILE[S] *, add JAR[S] *, add ARCHIVE[S] * : 添加 一個或多個 file, jar, archives到分佈式緩存
list FILE[S], list JAR[S], list ARCHIVE[S] : 輸出已經添加到分佈式緩存的資源
list FILE[S] *, list JAR[S] *,list ARCHIVE[S] * : 檢查給定的資源是否添加到分佈式緩存
delete FILE[S] *,delete JAR[S] *,delete ARCHIVE[S] * : 從分佈式緩存刪除指定的資源
! <command> : 從Hive shell執行一個shell命令
dfs <dfs command> : 從Hive shell執行一個dfs命令
<query string> : 執行一個Hive 查詢,而後輸出結果到標準輸出
source FILE <filepath>: 在CLI裏執行一個hive腳本文件
本文中是對hive的一些基本操做和經常使用的操做的實踐,在實際開發中是應用比較多的,在實踐中好多地方嘗試了好幾遍,遇到了不少問題,經過查詢網上的資料都解決了 ,在此記錄幫助和我同樣在學習hive的同窗,同時文中有不足的地方也請你們經過留言提出來,共同窗習。