hive創建表存儲格式

hive在建表是,能夠經過‘STORED AS FILE_FORMAT’ 指定存儲文件格式
例如:
java

[plain] view plaincopyapache

  1. > CREATE EXTERNAL TABLE MYTEST(num INT, name STRING)  oop

  2. > ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'  性能

  3. > STORED AS TEXTFILE  編碼

  4. > LOCATION '/data/test';  spa

指定文件存儲格式爲「TEXTFILE」。

hive文件存儲格式包括如下幾類:
.net

  • TEXTFILEcode

  • SEQUENCEFILEorm

  • RCFILEblog

  • 自定義格式

TEXTFIEL
默認格式,數據不作壓縮,磁盤開銷大,數據解析開銷大。
可結合Gzip、Bzip2使用(系統自動檢查,執行查詢時自動解壓),但使用這種方式,hive不會對數據進行切分,從而沒法對數據進行並行操做。
實例:

[plain] view plaincopy

  1. > create table test1(str STRING)  

  2. > STORED AS TEXTFILE;   

  3. OK  

  4. Time taken: 0.786 seconds  

  5. #寫腳本生成一個隨機字符串文件,導入文件:  

  6. > LOAD DATA LOCAL INPATH '/home/work/data/test.txt' INTO TABLE test1;  

  7. Copying data from file:/home/work/data/test.txt  

  8. Copying file: file:/home/work/data/test.txt  

  9. Loading data to table default.test1  

  10. OK  

  11. Time taken: 0.243 seconds  


SEQUENCEFILE:
SequenceFile是Hadoop API提供的一種二進制文件支持,其具備使用方便、可分割、可壓縮的特色。
SequenceFile支持三種壓縮選擇:NONE, RECORD, BLOCK。 Record壓縮率低,通常建議使用BLOCK壓縮。
示例:

[plain] view plaincopy

  1. > create table test2(str STRING)  

  2. > STORED AS SEQUENCEFILE;  

  3. OK  

  4. Time taken: 5.526 seconds  

  5. hive> SET hive.exec.compress.output=true;  

  6. hive> SET io.seqfile.compression.type=BLOCK;  

  7. hive> INSERT OVERWRITE TABLE test2 SELECT * FROM test1;  


RCFILE
RCFILE是一種行列存儲相結合的存儲方式。首先,其將數據按行分塊,保證同一個record在一個塊上,避免讀一個記錄須要讀取多個block。其次,塊數據列式存儲,有利於數據壓縮和快速的列存取。RCFILE文件示例:


實例:

[plain] view plaincopy

  1. > create table test3(str STRING)  

  2. > STORED AS RCFILE;  

  3. OK  

  4. Time taken: 0.184 seconds  

  5. >  INSERT OVERWRITE TABLE test3 SELECT * FROM test1;  


自定義格式
當用戶的數據文件格式不能被當前 Hive 所識別的時候,能夠自定義文件格式。
用戶能夠經過實現inputformat和outputformat來自定義輸入輸出格式,參考代碼:
.\hive-0.8.1\src\contrib\src\java\org\apache\hadoop\hive\contrib\fileformat\base64
實例:
建表

[plain] view plaincopy

  1. > create table test4(str STRING)  

  2. > stored as  

  3. > inputformat 'org.apache.hadoop.hive.contrib.fileformat.base64.Base64TextInputFormat'  

  4. > outputformat 'org.apache.hadoop.hive.contrib.fileformat.base64.Base64TextOutputFormat';  

$ cat test1.txt 
aGVsbG8saGl2ZQ==
aGVsbG8sd29ybGQ=
aGVsbG8saGFkb29w
test1文件爲base64編碼後的內容,decode後數據爲:
hello,hive
hello,world
hello,hadoop
load數據並查詢:

[plain] view plaincopy

  1. hive> LOAD DATA LOCAL INPATH '/home/work/test1.txt' INTO TABLE test4;   

  2. Copying data from file:/home/work/test1.txt  

  3. Copying file: file:/home/work/test1.txt  

  4. Loading data to table default.test4  

  5. OK  

  6. Time taken: 4.742 seconds  

  7. hive> select * from test4;  

  8. OK  

  9. hello,hive  

  10. hello,world  

  11. hello,hadoop  

  12. Time taken: 1.953 seconds  


總結:相比TEXTFILE和SEQUENCEFILE,RCFILE因爲列式存儲方式,數據加載時性能消耗較大,可是具備較好的壓縮比和查詢響應。數據倉庫的特色是一次寫入、屢次讀取,所以,總體來看,RCFILE相比其他兩種格式具備較明顯的優點。

相關文章
相關標籤/搜索