hive版本:0.9.0
數據存儲及解析
我們先來看下hive中如何建表,並通過分析建表語句了解hive中數據的存儲解析方式
create table tutorial (
name string, //string類型字段name
number int, //int類型字段number
resource array<string>, //string數組類型字段
detail map<string, int> //字典類型(key為字符串,value為整型)
) partitioned by (dt string) //按dt分區,dt類型為string
row format delimited fields terminated by '\t' //指定列分隔符為tab
collection items terminated by ',' //指定數組中字段分隔符為逗號
map keys terminated by ':' ; //指定字典中KV分隔符為冒號
根據上面的建表語句,對應的數據應該長這樣:
balabala2 222 str1,str2,str3 a:1,b:2,c:3
balabala3 333 str4,str5,str6 d:4,e:5,f:6
....
hive在讀取數據時,首先根據TAB對列進行分隔,得到name, number, source, detail,name和number不用繼續處理,可直接使用
source和detail屬於復雜數據類型,hive需要再次進行解析:根據逗號分隔source,detail,再根據冒號分隔detail中每一項的key和value
ps. 這其中涉及到一個概念:讀時模式 和 寫時模式
讀時模式:加載數據時進行數據檢驗(hive)
寫時模式:寫入數據時對照模式進行檢查(傳統RDBMS)
元數據
hive中的表由兩部分組成:一是元數據(可以簡單理解為表結構),二是數據,數據解析剛才分析過了,接下來看下元數據
元數據有三種存儲方式:
1. 內嵌derby:缺點不支持多會話
2. 本機mysql
3. 遠端mysql
目前我們的hadoop機器采用本機mysql的方式,數據存放在mysql中的metastore數據庫內
metastore中幾個重要的表:
1. dbs:存放hive所有數據庫信息
2. tbls:存放hive所有表格信息
3. table_params:存放hive所有表格的參數信息
4. columns_v2:存放表格的字段信息
剛才表的信息在mysql中存儲為:
分區partition
按照某幾列的值對數據進行划分
tutorial表按照列dt進行划分,目錄結構如下圖:
桶bucket
兩個用途:
1. 采樣:用於對一小部分數據進行測試
2. 加速map-side join:HiveQL相關,不做討論
索引
創建索引的語句:
CREATE INDEX idx ON TABLE db_player (yys, server_name, player_id) AS 'COMPACT' WITH DEFERRED REBUILD;
ALTER INDEX idx ON db_player REBUILD;
測試數據:
文件大小721MB,創建索引所需時間66s,索引大小531MB
查詢速度對比:無索引16s,有索引11s
在創建索引后,發現索引文件是保存在HDFS上的,目錄為:/user/hive/warehouse/gcld.db/gcld__db_player_idx__/
我們來看下索引文件的具體內容:
看到上圖相信大家就一目了然了,前三列是建立索引時指定的列(yys, server_name, player_id),第四列是數據的絕對路徑,第五列是一個數字,應該是類似地址的東西
在利用索引進行查詢時,首先查詢索引文件,然后根據前三列直接定位到數據在文件中的位置