Chapter 1: 引言 html
近期電信集團公司舉辦了大數據技術培訓課,按照要求,Hadoop小白的我對二者做完對比,進行實際操做作一個練習記錄吧,嘿嘿。。。 數據庫
二者的共同點:
1.hbase與hive都是架構在hadoop之上的。都是用hadoop做爲底層存儲
二者的區別: 服務器
2.Hive是創建在Hadoop之上爲了減小MapReduce jobs編寫工做的批處理系統,HBase是爲了支持彌補Hadoop對實時操做的缺陷的項目 。 架構
3.想象你在操做RMDB數據庫,若是是全表掃描,就用Hive+Hadoop,若是是索引訪問,就用HBase+Hadoop 。 框架
4.Hive query就是MapReduce jobs能夠從5分鐘到數小時不止,HBase是很是高效的,確定比Hive高效的多。 oop
5.Hive自己不存儲和計算數據,它徹底依賴於HDFS和MapReduce,Hive中的表純邏輯。 大數據
6.hive借用hadoop的MapReduce來完成一些hive中的命令的執行 搜索引擎
7.hbase是物理表,不是邏輯表,提供一個超大的內存hash表,搜索引擎經過它來存儲索引,方便查詢操做。 spa
8.hbase是列存儲。因此Hbase能夠對數據進行增改刪等操做,但Hive是行的,只能追加數據。 .net
9.hdfs做爲底層存儲,hdfs是存放文件的系統,而Hbase負責組織文件。
10.hive須要用到hdfs存儲文件,須要用到MapReduce計算框架。
Chapter 2: Hive操做
基礎操做:
登陸Hadoop的Master節點--》切換到Hadoop賬號-->使用Hive查看錶,並exit退出:
聯合查詢:
內鏈接:
hive> SELECT sales.*, things.* FROM sales JOIN things ON (sales.id = things.id);
查看hive爲某個查詢使用多少個MapReduce做業
hive> Explain SELECT sales.*, things.* FROM sales JOIN things ON (sales.id = things.id);
外鏈接:
hive> SELECT sales.*, things.* FROM sales LEFT OUTER JOIN things ON (sales.id = things.id);
hive> SELECT sales.*, things.* FROM sales RIGHT OUTER JOIN things ON (sales.id = things.id);
hive> SELECT sales.*, things.* FROM sales FULL OUTER JOIN things ON (sales.id = things.id);
in查詢:Hive不支持,但可使用LEFT SEMI JOIN
hive> SELECT * FROM things LEFT SEMI JOIN sales ON (sales.id = things.id);
CREATE TABLE ... AS SELECT:新表預先不存在
hive>CREATE TABLE target AS SELECT col1,col2 FROM source;
視圖查詢:
建立視圖:
hive> CREATE VIEW valid_records AS SELECT * FROM records2 WHERE temperature !=9999;
查看視圖詳細信息:
hive> DESCRIBE EXTENDED valid_records;
外部表、內部表、分區表的區別及操做:
此時,會在hdfs上新建一個tt表的數據存放地,例如,筆者是在 hdfs://master/input/table_data
上傳hdfs數據到表中:
load data inpath '/input/data' into table tt;
刪除tt表後,會將tt表的數據和元數據信息所有刪除,即最後/input/table_data下無數據,固然/input/data下再上一步已經沒有了數據!
若是建立內部表時沒有指定location,就會在/user/hive/warehouse/下新建一個表目錄,其他狀況同上。
注意的地方就是:load data會轉移數據!
2. 外部表:
create external table et (name string , age string);
load data inpath '/input/edata' into table et;
此時會把hdfs上/input/edata/下的數據轉到/user/hive/warehouse/et下,刪除這個外部表後,/user/hive/warehouse/et下的數據不會刪除,可是/input/edata/下的數據在上一步load後已經沒有了!數據的位置發生了變化!本質是load一個hdfs上的數據時會轉移數據!
3. 分區表
爲內部表某個分區導入數據,Hive將創建目錄並拷貝數據到分區當中
LOAD DATA LOCAL INPATH '${env:HOME}/california-employees'
INTO TABLE employees
PARTITION (country = 'US', state = 'CA');
爲外部表某個分區添加數據
ALTER TABLE log_messages ADD IF NOT EXISTS PARTITION(year = 2012, month = 1, day = 2)
LOCATION 'hdfs://master_server/data/log_messages/2012/01/02';
備註:Hive並不關心分區,目錄是否存在,是否有數據,這會致使沒有查詢結果
從本地文件系統中加載數據。 LOAD DATA LOCAL INPATH "/opt/data/1.txt" INTO TABLE table1; 意思是,從本地文件系統/opt/data/1.txt加載到hive的table1中。這時hive會讀取該文件,並將內容寫到hdfs中table1所在的位置。
Chapter 3: HBase操做
語法:
在安裝Hbase以前需先安裝Zookeeper,見http://xxx
操做 | 命令表達式 |
建立表 | create 'table_name', 'family1','family2','familyN' |
添加(更新)記錄 | put 'table_name', 'rowkey', 'family:column', 'value' |
查看記錄 | get 'table_name', 'rowkey' |
查看錶中的記錄總數 | count 'table_name' |
刪除記錄 | delete 'table_name' ,'rowkey' , 'family:column' deleteall 'table_name','rowkey' |
刪除一張表 | 先 disable 'table_name' 再 drop 'table_name' |
查看全部記錄 | scan "table_name" ,很危險 最好加LIMIT : scan 'table_name',LIMIT=>10 |
查看某個表某個列中全部數據 | scan "table" , {COLUMNS =>['family1:','family2' VERSIONS=2]} VERSIONS 選填 |
status //查看服務器狀態
version //查詢Hbase版本
create 'test','course','device' //建立表
list //列出全部的表
exists 'test' //查詢表是否存在
put 'test','Li Lei','course:Math','90'
put 'test','Han Meimei','course:English','92' //插入記錄
get 'test','Li Lei' //獲取一個Id的全部數據
get 'test','Li Lei','device' //獲取一個ID,一個列族的全部數據
get 'test','Li Lei','device:laptop' // 獲取一個ID,一個列族中的一個列的全部數據
更新一條記錄:
put 'test','Li Yang','device:laptop','Asus'
count 'test' //查看錶中有多少行
delete 'test','Li Yang','device:laptop‘ //刪除id爲’Li Yang’的值的’device:laptop’字段
deleteall 'test','Li Yang‘ //刪除整行
刪除表:
disable 'test'
drop 'test‘
退出:
exit