1. 程式人生 > 實用技巧 >Hadoop基礎(四十四):Hive 資料型別

Hadoop基礎(四十四):Hive 資料型別

1 基本資料型別

對於 Hive 的 String 型別相當於資料庫的 varchar 型別,該型別是一個可變的字串,不過它不能宣告其中最多能儲存多少個字元,理論上它可以儲存 2GB 的字元數。

2 集合資料型別

Hive 有三種複雜資料型別 ARRAY、MAP 和 STRUCT。ARRAY 和 MAP 與 Java 中的Array 和 Map 類似,而 STRUCT 與 C 語言中的 Struct 類似,它封裝了一個命名欄位集合,複雜資料型別允許任意層次的巢狀。 案例實操 1) 假設某表有如下一行,我們用 JSON 格式來表示其資料結構。在 Hive 下訪問的格式為
{
 "name": "songsong",
 
"friends": ["bingbing" , "lili"] , //列表 Array, "children": { //鍵值 Map, "xiao song": 18 , "xiaoxiao song": 19 } "address": { //結構 Struct, "street": "hui long guan" , "city": "beijing" } }
2)基於上述資料結構,我們在 Hive 裡建立對應的表,並匯入資料。建立本地測試檔案 test.txt
songsong,bingbing_lili,xiao song:18_xiaoxiao song:19,hui long
guan_beijing yangyang,caicai_susu,xiao yang:18_xiaoxiao yang:19,chao yang_beijing
注意:MAP,STRUCT 和 ARRAY 裡的元素間關係都可以用同一個字元表示,這裡用“_”。 3)Hive 上建立測試表 test
create table test(
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'; -- 行分隔符 4)匯入文字資料到測試表
hive (default)> load data local inpath ‘/opt/module/datas/test.txt’into table test
5)訪問三種集合列裡的資料,以下分別是 ARRAY,MAP,STRUCT 的訪問方式
hive (default)> select friends[1],children['xiao song'],address.city from test
where name="songsong";

3 型別轉化

Hive 的原子資料型別是可以進行隱式轉換的,類似於 Java 的型別轉換,例如某表示式使用 INT 型別,TINYINT 會自動轉換為 INT 型別,但是 Hive 不會進行反向轉化,例如, 某表示式使用 TINYINT 型別,INT 不會自動轉換為 TINYINT 型別,它會返回錯誤,除非使用 CAST 操作。 1.隱式型別轉換規則如下 (1)任何整數型別都可以隱式地轉換為一個範圍更廣的型別,如 TINYINT 可以轉換成 INT,INT 可以轉換成 BIGINT。 (2)所有整數型別、FLOAT 和 STRING 型別都可以隱式地轉換成 DOUBLE。 (3)TINYINT、SMALLINT、INT 都可以轉換為 FLOAT。 (4)BOOLEAN 型別不可以轉換為任何其它的型別。 2.可以使用 CAST 操作顯示進行資料型別轉換 例如 CAST('1' AS INT)將把字串'1' 轉換成整數 1;如果強制型別轉換失敗,如執行CAST('X' AS INT),表示式返回空值 NULL。
0: jdbc:hive2://hadoop102:10000> select '1'+2, cast('1'as int) + 2;
+------+------+--+
| _c0 | _c1 |
+------+------+--+
| 3.0 | 3 |
+------+------+--+