1. 程式人生 > >hive:資料型別及檔案格式

hive:資料型別及檔案格式

Hive的資料型別

    Hive 提供了基本資料型別和複雜資料型別

1.1 原始資料型別

  • 整型
    • TINYINT — 微整型,只佔用1個位元組,只能儲存0-255的整數。
    • SMALLINT– 小整型,佔用2個位元組,儲存範圍–32768 到 32767。
    • INT– 整型,佔用4個位元組,儲存範圍-2147483648到2147483647。
    • BIGINT– 長整型,佔用8個位元組,儲存範圍-2^63到2^63-1。
  • 布林型
    • BOOLEAN — TRUE/FALSE
  • 浮點型
    • FLOAT– 單精度浮點數。
    • DOUBLE– 雙精度浮點數。
  • 字串型
    • STRING– 不設定長度。

 

1.2 複合資料型別

  • Structs:一組由任意資料型別組成的結構。比如,定義一個欄位C的型別為STRUCT {a INT; b STRING},則可以使用a和C.b來獲取其中的元素值;
  • Maps:和Java中的Map相同,即儲存K-V對的;
  • Arrays:陣列;

 

複雜資料型別的宣告必須使用尖括號指明其中資料欄位的型別。定義三列,每列對應一種複雜的資料型別,如下所示。

CREATE TABLE complex(

         col1 ARRAY< INT>,

         col2 MAP< STRING,INT>,

         col3 STRUCT< a:STRING,b:INT,c:DOUBLE>

)

1.3 hive的檔案格式

TEXTFILE //文字,預設值

SEQUENCEFILE

// 二進位制序列檔案

RCFILE //列式儲存格式檔案 Hive0.6以後開始支援

ORC //列式儲存格式檔案,比RCFILE有更高的壓縮比和讀寫效率,Hive0.11以後開始支援

PARQUET //列出儲存格式檔案,Hive0.13以後開始支援

=========================================================================================

Hive檔案儲存格式包括以下幾類: 

[txt] view plain copy
1.TEXTFILE   
2.SEQUENCEFILE   
3.RCFILE   
4.自定義格式   


其中TEXTFILE為預設格式,建表時不指定,預設為這個格式,匯入資料時會直接把資料檔案拷貝到hdfs上不進行處理。 
SequenceFile,RCFile格式的表不能直接從本地檔案匯入資料,資料要先匯入到textfile格式的表中,然後再從textfile表中用insert匯入到SequenceFile,RCFile表中。 

TEXTFILE 
預設格式,資料不做壓縮,磁碟開銷大,資料解析開銷大。可結合Gzip、Bzip2使用(系統自動檢查,執行查詢時自動解壓),但使用這種方式,hive不會對資料進行切分,從而無法對資料進行並行操作。 

> create table test1(str STRING)  
> STORED AS TEXTFILE;
OK  
Time taken: 0.786 seconds  
#寫指令碼生成一個隨機字串檔案,匯入檔案:  
> LOAD DATA LOCAL INPATH '/home/work/data/test.txt' INTO TABLE test1;  
Copying data from file:/home/work/data/test.txt  
Copying file: file:/home/work/data/test.txt  
Loading data to table default.test1  
OK  
Time taken: 0.243 seconds  


SEQUENCEFILE 
SequenceFile是Hadoop API提供的一種二進位制檔案支援,其具有使用方便、可分割、可壓縮的特點。SequenceFile支援三種壓縮選擇:NONE, RECORD, BLOCK。 Record壓縮率低,一般建議使用BLOCK壓縮。 

> create table test2(str STRING)  
> STORED AS SEQUENCEFILE;  
OK  
Time taken: 5.526 seconds  
hive> SET hive.exec.compress.output=true;  
hive> SET io.seqfile.compression.type=BLOCK;  
hive> INSERT OVERWRITE TABLE test2 SELECT * FROM test1;  


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

> create table test3(str STRING)  
> STORED AS RCFILE;  
OK  
Time taken: 0.184 seconds  
>  INSERT OVERWRITE TABLE test3 SELECT * FROM test1;  


實踐證明RCFile目前沒有效能優勢, 只有儲存上能省10%的空間。作者自己都承認:Facebook用它也就是為了儲存。 RCFile目前沒有使用特殊的壓縮手段, 例如算術編碼, 字尾樹等, 沒有像InfoBright那樣能skip大量io。 

自定義格式 
當用戶的資料檔案格式不能被當前 Hive 所識別的時候,可以自定義檔案格式。使用者可以通過實現inputformat和outputformat來自定義輸入輸出格式,參考程式碼:.\hive-0.8.1\src\contrib\src\java\org\apache\hadoop\hive\contrib\fileformat\base64 

> create table test4(str STRING)  
> stored as  
> inputformat 'org.apache.hadoop.hive.contrib.fileformat.base64.Base64TextInputFormat'  
> 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資料並查詢: 

hive> LOAD DATA LOCAL INPATH '/home/work/test1.txt' INTO TABLE test4;   
Copying data from file:/home/work/test1.txt  
Copying file: file:/home/work/test1.txt  
Loading data to table default.test4  
OK  
Time taken: 4.742 seconds  
hive> select * from test4;  
OK  
hello,hive  
hello,world  
hello,hadoop  
Time taken: 1.953 seconds


總結 
相比TEXTFILE和SEQUENCEFILE,RCFILE由於列式儲存方式,資料載入時效能消耗較大,但是具有較好的壓縮比和查詢響應。資料倉庫的特點是一次寫入、多次讀取,因此,整體來看,RCFILE相比其餘兩種格式具有較明顯的優勢。
 

原文參考:

https://www.cnblogs.com/linzhong/p/8294980.html

https://blog.csdn.net/lan12334321234/article/details/70049959?utm_source=blogxgwz0