hive是基于Hadoop的一個數據倉庫工具,主要是用來進行數據的提取、轉化和加載,這是一種可以存儲、查詢和分析存儲在Hadoop中的大規模數據的機制。hive數據倉庫工具能将結構化的數據文件映射為一張數據庫表,并提供SQL查詢功能,能将SQL語句轉變成MapReduce任務來執行。它與關系型數據庫的SQL略有不同,但支持了絕大多數的語句。
在學習hive sql之前,我們需要對hive中常用的數據類型有一個基本的了解,這對于後面的學習會起到很大的幫助作用,如:建表、函數的使用、自定義函數等都需要考慮數據類型。
hive sql中的數據類型從大類上可分為如下兩類:基本數據類型和複雜數據類型。
其中基本數據類型和大多數關系型數據庫相近。
接下來我會詳細介紹hive sql中常用數據類型:
1、基本數據類型:這裡主要對hive中常用的基本數據類型進行介紹,具體會從範圍和用途進行介紹。
(1)數值型:
數值型又可分為整數型和浮點型。
大類 |
類型 |
範圍 |
用途描述 |
整數型 |
tinyint |
-128 ~ 127 |
1byte,有符号整數。 |
int |
-2^32~ 2^32-1 |
4byte,有符号整數。 | |
bigint |
-2^64~ 2^64-1 |
8byte,有符号整數。 | |
浮點型 |
float |
-3.40E 38~ 3.40E 38 |
4byte,單精度,浮點數值。 |
double |
-1.79E 308~ 1.79E 308 |
8byte,雙精度,浮點數值。 | |
decimal(size,d) |
高精度浮點型 |
任意精度,有符号小數。 |
說明:
1)DECIMAL(n,m)代表最多n位數字,m位小數;
2)如果沒有指定參數,那麼默認是DECIMAL(10,0),即沒有小數位。
(2)字符串型:
類型 |
用途描述 |
示例 |
char |
固定長度的字符串,最大255。 |
"a",'b' |
varchar |
可變長度的字符串。 |
"a",'b' |
string |
可變長度的字符串。 |
"a",'b' |
說明:hive中的string類型相當于mysql數據庫中的varchar類型,是一個可變的字符串數據類型。
(3)日期和時間型:
日期和時間型主要分為date(日期)和timestamp(時間戳)。
類型 |
用途描述 |
示例 |
timestamp |
時間戳,納秒精度 |
1625733394 |
date |
日期 |
"2021-07-09",'2021-07-09' |
(4)布爾型:
在實際中,有時候需要對一個屬性進行判斷為“是”或“否”,這個時候就可以用到布爾類型的數據類型了。
類型 |
範圍 |
用途描述 |
boolean |
布爾類型(取值範圍:true,false) |
true/false |
(5)其他類型:
類型 |
用途描述 |
binary |
字節數組 |
hive中常用的複雜數據類型有以下三類:ARRAY(數組)、MAP(鍵-值) 和 STRUCT(結構體)。
(1)array:
array表示一組相同數據類型的集合,索引從0開始,可以通過索引訪問數據。
例如:字段name的數據類型為數組array,數據[‘A’, ‘D’]可以通過索引獲取值,name[0]的值為A,name[1]的值為B。
語法:
array<data_type>
案例:獲取數組array類型的字段中的數據。
一、生成數據,以便用代碼實現:
1、創建表:
create table temp.user_address_temp(name string,address array<string>)
row format delimited fields terminated by '\t'
collection items terminated by ',';
說明:collection items terminated by ',' 指定數組中每個元素的分隔符;
2、插入數據,以便校驗結果:
insert into table temp.user_address_temp
select '小希', ARRAY('深圳', '武漢', '北京')
union all
select '可可', ARRAY('北京', '天津')
union all
select '丸子', ARRAY('杭州', '南京')
;
3、查看表中的數據:
select
*
from temp.user_address_temp;
結果如下:
二、查看結果,獲取數組字段中的數據,具體如下:
方法:通過訪問數組的序号可以獲取數組中對應位置的數據。
這裡分别獲取數組address中的第一個、第二個、第三個數據:
代碼如下:
select
name,
address[0] as first_values, -- address中的第一個數據
address[1] as second_values, -- address中的第二個數據
address[2] as third_values -- address中的第三個數據
from temp.user_address_temp
;
結果如下:
說明:由于“可可”和“丸子”的地址中隻有兩個值,故取地址中的第三個位置的值時為空。
(2)map:
MAP是一組鍵-值對,key—value。
例如:字段tmp的數據類型為字典map,map('A', 1, 'B', 2)在表中的數據{'A':1, 'B':2}可以通過訪問key來獲取對應的value的值,tmp['A']的值為1。
語法:
map<primitive_type, data_type>
說明:
1)通過key可以訪問到value;
2)key不能重複,相同的key會相互覆蓋,value可以有相同的值;
3)primitive_type表示鍵的數據類型,data_type表示值的數據類型。
案例:獲取字典map類型字段中value的值。
一、生成數據,以便用代碼實現:
1、創建表:
create table temp.user_score_temp(name string,score map<string,int>)
row format delimited fields terminated by '\t'
collection items terminated by ','
map keys terminated by ':';
說明:
1)collection items terminated by ',' 指定map集合中每個元素之間的分隔符,一組key-value;
2)map keys terminated by ':' 指定每一個元素中key和value之間的分隔符。
2、插入數據,以便校驗結果:
insert into table temp.user_score_temp
select '小希', MAP('數學', 89, '英語', 92)
union all
select '可可', MAP('語文', 79, '英語', 82)
union all
select '丸子', MAP('數學', 79, '英語', 68, '化學', 82)
;
3、查看表中的數據:
select
*
from temp.user_score_temp
;
二、查看結果,獲取字典map類型字段中value的值,具體如下:
方法:可以通過取字典map類型字段的key來獲取value的值。
這裡分别獲取字典類型字段score中的數學與英語的成績數據:
代碼如下:
select name,
score['數學'] as math_score,
score['英語'] as english_score
from temp.user_score_temp
;
結果如下:
如果要獲取語文、化學成績,方法一樣的,隻要改一下score['a']中的a的值就可以了。
(3)struct:
struct是結構體,通過相關的不同類型的數據來描述一個數據對象。
例如:如果字段tmp的數據類型是struct{first string, last string},那麼第1個元素可以通過字段tmp.first來獲取。
語法:
struct<col_name1 : data_type1 [comment col_comment], col_name2 : data_type2 [comment col_comment], ...>
說明:
1)struct類型的字段,字段中各屬性的數據類型可以不同;
2)每個屬性所對應列的數據類型是一樣的。
案例:獲取struct類型字段中的元素。
一、生成數據,以便用代碼實現:
1、創建表:
create table temp.stu_info_temp(id int, info struct<name:string, address:string, age:int>)
row format delimited fields terminated by '\t'
collection items terminated by ',';
說明:collection items terminated by ',' 指定struct集合中每個元素之間的分隔符。
2、插入數據,以便校驗結果:
-- 方法1:使用insert into方法插入數據
insert into table temp.stu_info_temp
select 1001, named_struct('name', '小希', 'address', '南京', 'age', 22)
union all
select 1002, named_struct('name', '丸子', 'address', '杭州', 'age', 20)
union all
select 1003, named_struct('name', '可可', 'address', '上海', 'age', 21)
;
-- 方法2:使用load data加載數據
準備數據文件 struct.txt:
id info
1001 小希,南京,22
1002 丸子,杭州,20
1003 可可,上海,21
加載數據:
load data local inpath '/root/struct.txt' into table stu_info_temp;
注:這裡插入數據的時候用的是named_struct,如果使用struct會導緻和之前的字段中定義的屬性名無法對應。
3、查看表中的數據:
select
*
from temp.stu_info_temp
;
二、查看結果,獲取struct類型字段中的元素,通過.符号方法,具體如下:
方法:可以通過.符号方法訪問元素。
這裡分别獲取info中的姓名、地址和年齡的數據:
代碼如下:
select
id,
info.name as name,
info.address as address,
info.age as age
from temp.stu_info_temp
;
結果如下:
關于複雜數據類型這塊就介紹這麼多了,文章中給出了語法解釋和使用方法,也可以參考相應的案例進行學習。後面我會對複雜數據類型中數據的轉換相關的函數進行介紹,以便大家可以更好的進行數據的獲取和清洗,開展數據分析工作,敬請期待呀。
寄語:
我愛生活,喜歡記錄生活中的點滴;
我愛向日葵,喜歡看着她朝着太陽微笑的樣子,甚是可愛溫暖。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!