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

字节数组

2、复杂数据类型:

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;

结果如下:

请简述hive 与传统数据库的区别(数据分析sql入门篇-hive)(1)

二、查看结果,获取数组字段中的数据,具体如下:

方法:通过访问数组的序号可以获取数组中对应位置的数据。

这里分别获取数组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 ;

结果如下:

请简述hive 与传统数据库的区别(数据分析sql入门篇-hive)(2)

说明:由于“可可”和“丸子”的地址中只有两个值,故取地址中的第三个位置的值时为空。

(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 ;

请简述hive 与传统数据库的区别(数据分析sql入门篇-hive)(3)

二、查看结果,获取字典map类型字段中value的值,具体如下:

方法:可以通过取字典map类型字段的key来获取value的值。

这里分别获取字典类型字段score中的数学与英语的成绩数据:

代码如下:

select name, score['数学'] as math_score, score['英语'] as english_score from temp.user_score_temp ;

结果如下:

请简述hive 与传统数据库的区别(数据分析sql入门篇-hive)(4)

如果要获取语文、化学成绩,方法一样的,只要改一下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 ;

结果如下:

请简述hive 与传统数据库的区别(数据分析sql入门篇-hive)(5)

关于复杂数据类型这块就介绍这么多了,文章中给出了语法解释和使用方法,也可以参考相应的案例进行学习。后面我会对复杂数据类型中数据的转换相关的函数进行介绍,以便大家可以更好的进行数据的获取和清洗,开展数据分析工作,敬请期待呀。

寄语:

我爱生活,喜欢记录生活中的点滴;

我爱向日葵,喜欢看着她朝着太阳微笑的样子,甚是可爱温暖。

,