解鎖更多數(shù)據(jù)分析文章歡迎關(guān)注公眾號:數(shù)據(jù)分析EPHS
本篇來學習一下Hive中的數(shù)據(jù)類型桨嫁,以及如何在Hive SQL中去處理這些數(shù)據(jù)類型驱富。
Hive的數(shù)據(jù)類型可以分為基本類型纱烘、字符串類型掌测、日期與時間戳類型欣簇、集合類型常空,我們分別進行介紹:
1瘫镇、 基本類型
Hive中的基本類型如下:
數(shù)據(jù)類型 | 大小 | 范圍 | 示例 |
---|---|---|---|
TINYINT | 1byte | -128 ~ 127 | 100Y |
SMALLINT | 2byte | -32768 ~ 32767 | 100S |
INT | 4byte | -2^32~ 2^32-1 | 100 |
BIGINT | 8byte | -2^64~ 2^64-1 | 100L |
FLOAT | 4byte | 單精度浮點數(shù) | 5.21 |
DOUBLE | 8byte | 雙精度浮點數(shù) | 5.21 |
DECIMAL | - | 高精度浮點數(shù) | DECIMAL(9,8) |
BOOLEAN | - | 布爾型 | true/false |
BINARY | - | 字節(jié)數(shù)組 | - |
這里我們對DECIMAL類型做兩點說明:
1)DECIMAL(9,8)代表最多9位數(shù)字鼎兽,后8位是小數(shù)。此時也就是說铣除,小數(shù)點前最多有1位數(shù)字谚咬,如果超過一位則會變成null。
2)如果不指定參數(shù)尚粘,那么默認是DECIMAL(10,0)择卦,即沒有小數(shù)位,此時0.82會變成1。
這里我們通過一個SQL來進行說明:
創(chuàng)建表:
create table if not exists
datatype_test1(id int,col1 decimal,col2 decimal(9,8))
row format delimited fields terminated by ',';
我們從txt中讀取數(shù)據(jù):
load data local inpath '/Users/meituan_sxw/Downloads/test1.txt' into table datatype_test1;
#txt中的內(nèi)容
1,0.82,83.2
2,1.06,9.22
接下來查看hive中的數(shù)據(jù):
select * from datatype_test1;
結(jié)果如下:
2秉继、字符串類型
Hive中的字符串類型包含如下三種:
數(shù)據(jù)類型 | 長度 | 示例 |
---|---|---|
STRING | - | 'abc' |
VARCHAR | 1-65535 | 'abc' |
CHAR | 1-255 | 'abc' |
對于VARCHAR創(chuàng)建時需指定長度祈噪,如果插入的字符串超過了指定的長度,則會被截斷尚辑,尾部的空格也會作為字符串的一部分辑鲤,影響字符串的比較。
對于CHAR類型來說杠茬,它是固定長度的月褥,如果插入的字符串長度不如指定的長度,則會用空格補齊瓢喉。但是尾部的空格不影響字符串的比較宁赤。
接下來通過例子進行說明:
創(chuàng)建表:
create table if not exists
datatype_test2(id int,str_col string,varchar_col varchar(5),char_col char(5))
row format delimited fields terminated by ',';
我們從txt中讀取數(shù)據(jù):
load data local inpath '/Users/meituan_sxw/Downloads/test2.txt' into table datatype_test2;
#txt中的內(nèi)容
1,james harden,harden,harden
2,Westbrook,westbrook,westbrook
3,chris paul,paul,paul
接下來查看hive中的數(shù)據(jù):
select * from datatype_test2;
結(jié)果如下:
再來看一下對于不同類型的字符串比較的例子,這里只需要注意第三行即可:
select
*,
char_col='paul ',
varchar_col='paul ',
char_col='paul',
varchar_col='paul'
from
datatype_test2;
結(jié)果如下:
可以看到灯荧,對于尾部的空格,并不影響char類型字符串的比較盐杂,但影響了varchar類型字符串的比較逗载。
3、日期與時間戳類型
日期與時間戳類型主要有以下兩種:
數(shù)據(jù)類型 | 格式 | 示例 |
---|---|---|
DATE | yyyy-MM-dd | 2020-07-04 |
TIMESTAMPS | yyyy-MM-dd HH:mm:ss.fffffffff | 2020-07-04 12:36:25.111 |
接下來做兩點說明:
1)DATE類型只支持yyyy-MM-dd格式的數(shù)據(jù)链烈,其余格式都是錯誤的厉斟,會變?yōu)镹ULL
2)TIMESTAMPS表示UTC時間,格式為yyyy-MM-dd HH:mm:ss.fffffffff强衡,即最多支持納秒級擦秽,如果長度超出,則會變成NULL
接下來還是通過例子來說明:
創(chuàng)建表:
create table if not exists
datatype_test3(id int,date_col Date,timestamp_col timestamp)
row format delimited fields terminated by ',';
我們從txt中讀取數(shù)據(jù):
load data local inpath '/Users/meituan_sxw/Downloads/test3.txt' into table datatype_test3;
#txt中的內(nèi)容
1,2020-07-04,2020-07-04 13:20:23.22
2,20200704,2020-07-04 13:20:23.222222222
3,2020-07-04,2020-07-04 13:20:23.22222222222
接下來查看hive中的數(shù)據(jù):
select * from datatype_test3;
結(jié)果如下:
4漩勤、集合類型
Hive中集合類型主要包含三種:STRUCT感挥、ARRAY、MAP越败。咱們來分別介紹触幼。
STRUCT
STRUCT 即結(jié)構(gòu)體,通過相關(guān)的不同類型的數(shù)據(jù)來描述一個數(shù)據(jù)對象
ARRAY
ARRAY表示一組相同數(shù)據(jù)類型的集合究飞,下標從零開始置谦,可以用下標訪問
MAP
MAP是一組鍵值對的組合,可以通過KEY訪問VALUE
通過例子來感受下上述三種類型的使用:
創(chuàng)建表:
create table if not exists
datatype_test4(
id int,
info struct<name:string,weight:double>,
score array<Int>,
info_map map<string,string>)
row format delimited fields terminated by ','
COLLECTION ITEMS TERMINATED BY ';'
MAP KEYS TERMINATED BY ':';
可以看到亿傅,我們定義了三種不同的集合類型字段媒峡,并指定了集合類型的分隔符為";",即struct葵擎,array谅阿,以及map的不同kv之間用";"分割,同時定義了map的key和value之間用":"分割。
接下來奔穿,我們創(chuàng)建如下內(nèi)容的txt文件:
1,文文;70,99;96;100,name:文文;country:china
2,毛毛;60,99;92;100,name:毛毛;country:koera
3,超超;65,99;96;100,name:超超;country:japan
倒入hive中并查看:
load data local inpath '/Users/meituan_sxw/Downloads/test4.txt' into table datatype_test4;
select * from datatype_test4;
結(jié)果如下:
接下來镜沽,進一步介紹不同類型的讀取,首先是struct類型贱田,可以通過"."來訪問不同的內(nèi)容:
select
info.name as name,
info.weight as weight
from
datatype_test4;
#輸出
文文 70.0
毛毛 60.0
超超 65.0
對于Array類型缅茉,可以通過下標進行訪問,下標從0開始:
select
info.name as name,
score[0] as math,
score[1] as chinese,
score[2] as English
from
datatype_test4;
# 輸出
文文 99 96 100
毛毛 99 92 100
超超 99 96 100
對于Map類型男摧,可以通過['key']來訪問不同key的內(nèi)容
select
info_map['name'] as name,
info_map['country'] as country
from
datatype_test4;
#輸出
文文 china
毛毛 koera
超超 Japan
集合類型還包括UNIONTYPE蔬墩,這里不做介紹,感興趣的同學可自行查閱相關(guān)資料耗拓。
參考文獻
1拇颅、http://www.reibang.com/p/1c9263cc2f9a
2、https://segmentfault.com/a/1190000016125717?utm_source=tag-newest