Hive


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),第四列是數據的絕對路徑,第五列是一個數字,應該是類似地址的東西

在利用索引進行查詢時,首先查詢索引文件,然后根據前三列直接定位到數據在文件中的位置


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM