Hive常用的數據類型概述
作者:尹正傑
版權聲明:原創作品,謝絕轉載!否則將追究法律責任。
一.基本數據類型
Hive數據類型 |
對應Java數據類型 |
長度(數據取值范圍) |
備注 |
TINYINT |
byte |
1 byte有符號(即最高位為"符號位",下同)整數(取值范圍為:-128~127) |
|
SMALINT |
short |
2 byte有符號整數(取值范圍為: -32768~32767) |
|
INT |
int |
4 byte有符號整數(取值范圍為: -2147483648~2147483647) |
|
BIGINT |
long |
8 byte有符號整數(取值范圍為: -9223372036854775808~9223372036854775807) |
|
BOOLEAN |
boolean |
布爾類型(取值范圍:true,false) |
|
FLOAT |
float |
4 byte的單精度浮點數(1位符號位,8位指數,23位小數) |
其中小數部分(2 ** 23)對應最大的十進制數字為:8388608,這是一個7位十進制數字。 可惜呀,這個數字要比9999999小,因此為了百分百保證精度,我們通常說float精度可以保證十進制的6位運算。 |
DOUBLE |
double |
8 byte的雙精度浮點數(1位符號位,11位指數,52位小數) |
其中小數部分(2 ** 52)對應最大的十進制數字為:4503599627370496,這是一個16位十進制數字。 同理,這個數字要比9999999999999999小,因此為了百分百保證精度,我們通常說double精度可以保證十進制的15位運算。 |
STRING |
string |
可以使用單引號('')或者雙引號("")定義字符串,他是一個字符集合。 |
當然,關於字符集合自然會設計到字符編碼問題喲~ |
TIMESTAMP |
|
時間類型 |
|
BINARY |
|
字節數組 |
|
溫馨提示:
對於Hive的String類型相當於MySQL數據庫的varchar類型,該類型是一個可變的字符串。不過它不能聲明其中最多能存儲多少個字符,但理論上它可以存儲2GB的字符數。
在Java編程中,如果double類型都無法表示的精度,可以使用java中的BigDecimal類型,它能支持跟高精度的運算喲~
二.集合數據類型
Hive有三種復雜數據類型ARRAY、MAP和STRUCT。如下所示: ARRAY: 數組是一組具有相同類型和名稱的變量的集合。這些變量稱為數組的元素,每個數組元素都有一個編號,編號從零開始。與Java中的Array類似。 MAP: MAP是一組鍵-值對元組集合,使用數組表示法可以訪問數據。與Java中的Map類似。 STRUCT: 和c語言中的struct類似,都可以通過“點”符號訪問元素內容。
接下來我們來一起看一個案例,來體會一下這三種復雜數據類型。
1>. 假設某表有如下兩行,我們用JSON格式來表示其數據結構(注釋內容為Hive中的訪問格式)。
{ "name": "曹操", "friends": ["荀彧" , "典韋"] , //列表Array, "children": { //鍵值Map, "曹昂": 30, "曹丕": 25, "曹彰":22, "曹沖":18 } "address": { //結構Struct, "street": "丞相府" , "city": "許昌" } }, { "name": "劉備", "friends": ["諸葛亮" , "龐統"] , //列表Array, "children": { //鍵值Map, "劉禪": 25, "劉永": 20, "劉理":15 } "address": { //結構Struct, "street": "武擔山", "city": "成都" } }, ...
2>.基於上述數據結構,我們在Hive里創建對應的表,並導入數據。
[root@hadoop105.yinzhengjie.com ~]# vim sanguo.txt [root@hadoop105.yinzhengjie.com ~]# [root@hadoop105.yinzhengjie.com ~]# cat sanguo.txt 曹操,荀彧_典韋,曹昂_:30_曹丕:25_曹彰:22_曹沖:18,丞相府_許昌 劉備,諸葛亮_龐統,劉禪:25_劉永:20_劉理:15,武擔山_成都 [root@hadoop105.yinzhengjie.com ~]# 溫馨提示: MAP,STRUCT和ARRAY里的元素間關系都可以用同一個字符表示,這里用"_"。
3>.Hive上創建測試表(sanguo)
create table sanguo( name string, friends array<string>, children map<string, int>, address struct<street:string, city:string> ) row format delimited fields terminated by ',' collection items terminated by '_' map keys terminated by ':' lines terminated by '\n'; 行格式定義(row format delimited)參數含義如下所示: fields terminated by ',' 指定列分隔符。 collection items terminated by '_' 指定MAP STRUCT 和 ARRAY 的分隔符(數據分割符號) map keys terminated by ':' 指定MAP中的key與value的分隔符 lines terminated by '\n'; 指定行分隔符,若不指定,則默認為"\n"。
4>.導入文本數據到測試表
load data local inpath '/root/sanguo.txt' into table sanguo;
5>.訪問三種集合列里的數據,以下分別是ARRAY,MAP,STRUCT的訪問方式
select * from sanguo; select friends[1],children['劉禪'],address.city from sanguo where name="劉備"; select friends[1],children['曹丕'],address.city from sanguo where name="曹操";
三.類型轉換
1>.類型轉換概述
Hive的原子數據類型(其實就是基礎數據類型)是可以進行隱式轉換的。
類似於Java的類型轉換,例如某表達式使用INT類型,TINYINT會自動轉換為INT類型。
但是Hive不會進行反向轉化,例如,某表達式使用TINYINT類型,INT不會自動轉換為TINYINT類型,它會返回錯誤,除非使用CAST操作進行強制類型轉換。
綜上所述,隱式類型轉換我們稱為自動類型轉換,它可以從小的范圍轉換到大的范圍。強制類型轉換則是從大的類型范圍轉換為小的類型范圍(可能存在數據丟失的風險)。
2>.隱式類型轉換規則
隱式類型轉換規則如下所示: (1)任何整數類型都可以隱式地轉換為一個范圍更廣的類型,如TINYINT可以轉換成INT,INT可以轉換成BIGINT。 (2)所有整數類型、FLOAT和STRING類型都可以隱式地轉換成DOUBLE。 (3)TINYINT、SMALLINT、INT都可以轉換為FLOAT。 (4)BOOLEAN類型不可以轉換為任何其它的類型。
3>.強制類型轉換(可以使用CAST操作顯示進行數據類型轉換)
SELECT "100" + 25; // 這里會自動發生類型轉換,將字符串類型轉換成DOUBLE類型。 SELECT CAST("100" AS INT) + 25; // 這里我們將字符串類型轉換為INT類型。 SELECT CAST("10AF" AS INT); // 當類型轉換失敗時會返回NULL。