一.基本數據類型
HIVE | MySQL | JAVA | 長度 | 例子 |
---|---|---|---|---|
TINYINT | TINYINT | byte | 1byte有符號整數 | 2 |
SMALINT | SMALINT | short | 2byte有符號整數 | 20 |
INT | INT | int | 4byte有符號整數 | 20 |
BIGINT | BIGINT | long | 8byte有符號整數 | 20 |
BOOLEAN | 無 | boolean | 布爾類型,true或者false | TRUE FALSE |
FLOAT | FLOAT | float | 單精度浮點數 | 3.14159 |
DOUBLE | DOUBLE | double | 雙精度浮點數 | 3.14159 |
STRING | VARCHAR | string | 字符系列。可以指定字符集。可以使用單引號或者雙引號。 | ‘now is the time’ “for all good men” |
TIMESTAMP | TIMESTAMP | 時間類型 | ||
BINARY | BINARY | 字節數組 |
對於Hive的String類型相當於數據庫的varchar類型,該類型是一個可變的字符串,不過它不能聲明其中最多能存儲多少個字符,理論上它可以存儲2GB的字符數。
案例實操
利用基本數據類型建表測試
create table test(id int,weight double,name string,money bigint);
利用insert語句按照指定的數據類型插入一條數據
insert into test values(1001,75,"zhangsan",1000000000000);
二.集合數據類型
數據類型 | 描述 | 語法示例 |
---|---|---|
STRUCT | 和c語言中的struct類似,都可以通過“點”符號訪問元素內容。例如,如果某個列的數據類型是STRUCT{first STRING, last STRING},那么第1個元素可以通過字段.first來引用。 | struct() 例如 struct<street:string, city:string> |
MAP | MAP是一組鍵-值對元組集合,使用數組表示法可以訪問數據。例如,如果某個列的數據類型是MAP,其中鍵->值對是’first’->’John’和’last’->’Doe’,那么可以通過字段名[‘last’]獲取最后一個元素 | map() 例如map<string, int> |
ARRAY | 數組是一組具有相同類型和名稱的變量的集合。這些變量稱為數組的元素,每個數組元素都有一個編號,編號從零開始。例如,數組值為[‘John’, ‘Doe’],那么第2個元素可以通過數組名[1]進行引用。 | Array() 例如array< string> |
案例實操
測試數據
songsong,bingbing_lili,xiao song:18_xiaoxiao song:19,hui long guan_beijing_10010
yangyang,caicai_susu,xiao yang:18_xiaoxiao yang:19,chao yang_beijing_10011
建Hive表
create table person(
name string,
friend array<string>,
children map<string,int>,
address struct<street:string,city:string,email:int>
)
row format delimited fields terminated by ',' -- 列分隔符
collection items terminated by '_' --MAP STRUCT 和 ARRAY 的分隔符(數據分割符號)
map keys terminated by ':' -- MAP中的key與value的分隔符
lines terminated by '\n'; -- 行分隔符
加載數據
load data local inpath '/opt/module/hive/datas/person.txt' into table person;
查詢數據
select * from person;
需求:查出來songsong 這個人的姓名,第一個朋友,孩子xiaoxiao song的年齡,和他的郵編
ARRAY,MAP,STRUCT的訪問方式
select name,friend[0],children['xiaoxiao song'],address.email
from person
where name = 'songsong';
Map類型
樣例數據
{'k0':'abc','k1':'01,02,03','k2':'456'}
-
size(Map)函數:可得map的長度。返回值類型:int
select size(t.params); >> 3
-
map_keys(Map)函數:可得map中所有的key; 返回值類型: array
select map_keys(t.params);
>> ["k0","k1","k2"]
-
map_values(Map)函數:可得map中所有的value; 返回值類型: array
select map_value(t.params); >> ["abc","01,02,03","456"]
-
判斷map中是否包含某個key值:
select array_contains(map_keys(t.params),'k0'); >> true
-
在k-v對中,若value有多個值的情況,如 {****'k1':'01,02,03'} ,如果要用 'k1' 中 '02'作為過濾條件,則語句如下(這里用到split來處理):
select * from t where split(t.params['k1'],',')[1] >> 02
-
如果過濾條件為:k2的值必須為'45'開頭,則語句如下:
(這里用到substr方法來處理,這里注明一下,1和2分別表示起始位置和長度)
select * from t where substr(t.params['k2'],1,2) = '45'
三.類型轉換
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( vlaue AS type)
例如CAST('1' AS INT)將把字符串'1' 轉換成整數1;如果強制類型轉換失敗,如執行CAST('X' AS INT),表達式返回空值 NULL。