Hive 支持關(guān)系型數(shù)據(jù)庫中的大多數(shù)基本數(shù)據(jù)類型,同時(shí)也支持關(guān)系型數(shù)據(jù)庫中很少出現(xiàn)的3種集合數(shù)據(jù)類型,首先我們來介紹一下這些數(shù)據(jù)類型。
1、基本數(shù)據(jù)類型
| 數(shù)據(jù)類型 | 長度 |
|---|---|
| TINYINT | 1byte有符號(hào)整數(shù) |
| SMALLINT | 2byte有符號(hào)整數(shù) |
| INT | 4byte有符號(hào)整數(shù) |
| BIGINT | 8byte有符號(hào)整數(shù) |
| BOOLEAN | 布爾類型 |
| FLOAT | 單精度浮點(diǎn)數(shù) |
| DOUBLE | 雙精度浮點(diǎn)數(shù) |
| STRING | 字符序列,可以指定字符集,可以使用單引號(hào)或者雙引號(hào) |
| TIMESTAMP | 整數(shù)、浮點(diǎn)數(shù)或者字符串 |
| BINARY | 字節(jié)數(shù)組 |
需要注意的是,所有的上述數(shù)據(jù)類型都是對JAVA接口的實(shí)現(xiàn),因此這些類型的具體行為細(xì)節(jié)和Java當(dāng)中對應(yīng)的類型是完全一致的。例如STRING類型實(shí)現(xiàn)的是java中的String,F(xiàn)LOAT實(shí)現(xiàn)的是Java中的float等等。
新增數(shù)據(jù)類型TIMESTAMP的值可以是整數(shù),也就是距離Unix新紀(jì)元時(shí)間(1970年1月1日,午夜12點(diǎn))的秒數(shù),也可以是浮點(diǎn)數(shù),即距離UNIX新紀(jì)元時(shí)間的秒數(shù),精確到納秒(小數(shù)點(diǎn)后保留9位數(shù));還可以是字符串,即JDBC所約定的時(shí)間字符串格式,格式為YYYY-MM-DD hh:mm:ss.fffffffff.
TIMESTAMPS表示的是UTC時(shí)間。Hive本身提供了不同時(shí)區(qū)互相轉(zhuǎn)換的內(nèi)置函數(shù),也就是to_utc_timestamp函數(shù)和from_tuc_timestamp函數(shù)。
如果用戶在查詢中將一個(gè)float類型的列和一個(gè)double類型的列做對比或者將一種整型類型和另一種整型類型的值做對比,那么結(jié)果將會(huì)怎樣呢?Hive會(huì)隱式地將類型轉(zhuǎn)換為兩個(gè)整形類型種值較大的那個(gè)類型,也就是會(huì)將float轉(zhuǎn)換為double類型,而且如有必要,也會(huì)將任意的整形類型轉(zhuǎn)換為double類型,因此事實(shí)上是同類型之間的比較。
如果用戶希望將一個(gè)字符串類型的列轉(zhuǎn)換為數(shù)值呢?這種情況下用戶可以顯式地將一種數(shù)據(jù)類型轉(zhuǎn)換為其他一種數(shù)據(jù)類型,使用cast函數(shù)即可。
2、集合數(shù)據(jù)類型
Hive中的列支持使用struct,map和array集合數(shù)據(jù)類型:
| 數(shù)據(jù)類型 | 描述 | 示例 |
|---|---|---|
| STRUCT | 和c語言中的struct或者‘對象’類似,都可以通過點(diǎn)符號(hào)訪問元素內(nèi)容,例如某個(gè)列的數(shù)據(jù)類型是STRUCT{first STRING,last STRING},那么第一個(gè)元素可以通過字段名.first來引用。 | struct('John','Doe') |
| MAP | MAP是一組鍵值對元素集合,使用數(shù)組表示法可以訪問元素,例如,某個(gè)列的數(shù)據(jù)類型是MAP,其中鍵值對是'first'->'John' 和 'last' -> 'Doe',那么可以通過字段名['last']獲取最后一個(gè)元素 | map('first','JOIN','last','Doe' |
| ARRAY | 數(shù)組是一組具有相同類型和名稱的變量的集合,這些變量稱為數(shù)組的元素,每個(gè)數(shù)組元素都有一個(gè)編號(hào),編號(hào)從0開始 | Array('John','Doe') |
這里有一個(gè)用于演示如何使用這些數(shù)據(jù)類型的表結(jié)構(gòu)聲明語句,這是一張?zhí)摌?gòu)的人力資源應(yīng)用程序中的員工表:
CREATE TABLE IF NOT EXIST employees(
name STRING,
salary FLOAT,
subordinates ARRAY<STRING>,
deductions MAP<STRING,FLOAT>,
address STRUCT<street:STRING, city:STRING,state:STRING,zip:INT>
)
其中,那么是一個(gè)簡單的字符串,對于大多數(shù)雇員來說,salary使用float浮點(diǎn)數(shù)類型來表示己經(jīng)足夠了。subordinates(下屬員工)列表是一個(gè)字符串值數(shù)組。字段deductions是一個(gè)由鍵值對構(gòu)成的map,其記錄了每一次的扣除額,這些錢將會(huì)在發(fā)薪水的時(shí)候從員工工資中扣除。map中的鍵時(shí)扣除金額項(xiàng)目的名稱,值可以是一個(gè)百分比值,也可以完全就是一個(gè)數(shù)值。最后,每名雇員的家庭住址使用struct數(shù)據(jù)類型存儲(chǔ),其中的每個(gè)域都被作了命名,并且具有一個(gè)特定的數(shù)據(jù)類型。