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