Hive基礎(四):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 |
+------+------+--+

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM