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
;
结果如下:
关于复杂数据类型这块就介绍这么多了,文章中给出了语法解释和使用方法,也可以参考相应的案例进行学习。后面我会对复杂数据类型中数据的转换相关的函数进行介绍,以便大家可以更好的进行数据的获取和清洗,开展数据分析工作,敬请期待呀。
寄语:
我爱生活,喜欢记录生活中的点滴;
我爱向日葵,喜欢看着她朝着太阳微笑的样子,甚是可爱温暖。
,