Hive是基於Hadoop的資料倉儲平台。
Hive提供了類SQL查詢語言。Hive的資料存放區於HDFS中。一般情況下,使用者提交的查詢將被Hive轉換為MapReduce作業並提交給Hadoop運行。
我們從Hive的安裝開始,逐步學習Hive的方方面面。
安裝Hive安裝前提
l Java 6
l Hadoop
選擇哪一個版本請參照Hive官方文檔。安裝Have是不需要特別設定關於Hadoop的資訊,只要保證HADOOP_HOME環境變數正確設定就可以了。
安裝
我們選擇下載0.11.1穩定版本。:
http://mirrors.hust.edu.cn/apache/hive/stable/
1) 解壓安裝包到指定的目錄:
tar xzf hive-0.11.0.tar.gz
2) 設定環境變數
export HIVE_INSTALL=/opt/Hive-0.11.0
export PATH=$PATH:$HIVE_INSTALL/bin
3)輸入以下命令進入Shell
Hive
Hive互動環境( Shell)
Shell是我們和Hive互動的主要工具。
Hive的查詢語言我們稱為HiveQL。HiveQL的設計受到了MySQL的很多影響,所以如果你熟悉MySQL的話,你會發現使用HiveQL是同樣的方便。
進入Shell後,輸入以下命令看看Hive是否工作正常:
SHOW TABLES;
輸出結果為:
OK
Time taken: 8.207seconds
如果輸出結果顯示有錯誤,可能是Hadoop沒有運行,或者HADOOP_HOME變數沒有真確設定。
和SQL一樣,HiveQL一般是大小寫無關的(字串比較除外)。
輸入命令是按Tab鍵,Hive將提示所有可用的輸入。(命令自動完成)
第一次使用該命令可能會花上好幾秒中甚至更長,因為Hive將建立metastore資料庫(儲存於metastore_db目錄,此目錄在你運行hive時所在目錄之下,所以第一次運行Hive時,請先進入到合適的目錄下)。
我們也可以直接從命令列運行hive指令碼,比如:
hive –f /home/user/ hive.q
其中,-f 後面跟上指令檔名(包括路徑)。
無論是在互動模式還是非互動模式下,hive一般都會輸出一些輔助資訊,比如執行命令的時間等。如果你不需要輸出這些訊息,可以在進入hive時加上-s選項,比如:
hive –S
注意:S為大寫
簡單樣本
我們以以下資料作為測試資料,結構為(班級號,學號,成績)。
C01,N0101,82
C01,N0102,59
C01,N0103,65
C02,N0201,81
C02,N0202,82
C02,N0203,79
C03,N0301,56
C03,N0302,92
C03,N0306,72
執行以下命令:
create table student(classNostring, stuNo string, score int) row format delimited fields terminated by ',';
其中,定義表結構和SQL類似.。其它設定表示欄位間以逗號分隔,一行為一個記錄。
load data local inpath '/home/user/input/student.txt'overwrite into table student;
輸出結果如下:
Copying data fromfile:/home/user/input/student.txt
Copying file:file:/home/user/input/student.txt
Loading data to tabledefault.student
rmr: DEPRECATED: Please use 'rm-r' instead.
Deleted/user/hive/warehouse/student
Table default.student stats:[num_partitions: 0, num_files: 1, num_rows: 0, total_size: 117, raw_data_size:0]
這個命令將student.txt檔案內容載入到表student中。這個載入操作將直接把student.txt檔案複製到hive的warehouse目錄中,這個目錄由hive.metastore.warehouse.dir配置項設定,預設值為/user/hive/warehouse。Overwrite選項將導致Hive事先刪除student目錄下所有的檔案。
Hive不會對student.txt做任何格式處理,因為Hive本身並不強調資料的儲存格式。
此例中,Hive將資料存放區於HDFS系統中。當然,Hive也可以將資料存放區於本地。
如果不加overwrite選項,且載入的檔案在Hive中已經存在,則Hive會為檔案重新命名。比如不加overwrite選項將以上命令執行兩次,則第二次載入後,hive中新產生的檔案名稱將會是“student_copy_1.txt”。(和Hadoop權威教程中描述的不一致,讀者請謹慎驗證)
接下來,我們執行以下命令:
select * from student;
輸出如下:
C01 N0101 82
C01 N0102 59
C01 N0103 65
C02 N0201 81
C02 N0202 82
C02 N0203 79
C03 N0301 56
C03 N0302 92
C03 N0306 72
執行以下命令:
Select classNo,count(score) fromstudent where score>=60 group by classNo;
輸出如下:
C01 2
C02 3
C03 2
由此看見,HiveQL的使用和SQL及其類似。我們用到了group和count,其實在後台Hive將這些操作都轉換成了MapReduce操作提交給Hadoop執行,並最終輸出結果。