数据类型
Hive的数据类型可以分为两种,一种是基本数据类型,另一种是集合数据类型
1、基本数据类型
Hive数据类型 | Java数据类型 | 长度 | 例子 |
---|---|---|---|
TINYINT | byte | 1byte有符号整数 | 20 |
SMALINT | short | 2byte有符号整数 | 20 |
INT | int | 4byte有符号整数 | 20 |
BIGINT | long | 8byte有符号整数 | 20 |
BOOLEAN | boolean | 布尔类型,true或者false | TRUE FALSE |
FLOAT | float | 单精度浮点数 | 3.14159 |
DOUBLE | double | 双精度浮点数 | 3.14159 |
STRING | string | 字符系列。可以指定字符集。 可以使用单引号或者双引号。 | ‘now is the time’ “for all good men” |
TIMESTAMP | 时间类型 | ||
BINARY | 字节数组 |
2、集合数据类型
几何数据类型分为三种:STRUCT 、MAP 、 ARRAY
数据类型 | 描述 | 语法示例 |
---|---|---|
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 |
Hive的Map类型和Java的Map类型相似,Array类型也和Java的Array类型相似,而STRUCT类似于Python中的字典类型,但是很灵活,为键值对形式,但是值又可以为多种类型,比如字符串、列表、map等类型,属于一种嵌套的数据类型
举例:
比如对于一种表的数据如下,属于JSON类型:
{
"name": "tangseng",
"friends": ["fozu" , "pusa"] , //列表Array,
"students": { //键值Map,
"sunwukong": 19 ,
"zhubajie": 18,
"shaseng":20,
}
"address": { //结构Struct,
"street": "datang" ,
"city": "dongtu"
}
}
基于上述的数据,我们在hive中创建相应的表,并且导入数据
①首先需要创建该文件
vim /opt/module/hive/datas/personinfo
tangseng,fozu_pusa,sunwukong:19_zhubajie:18_shaseng:20,datang_dongtu
sunwukong,zhubajie_shasheng,chengxiang:16_xiaoyu:17,shuiliandong_huaguoshan
注意:用逗号“,”表示一个键值对,值中用下划线“_”将各个值分开,结构用回车分开
②在hive中创建表personinfo
create table personInfo (
name string,
friends array<string>,
students map<string, int>,
address struct<street:string, city:string>
)
row format delimited
fields terminated by ','
collection items terminated by '_'
map keys terminated by ':'
lines terminated by '\n';
语句说明:
语句 | 说明 |
---|---|
name string | name字段为String类型 |
friend array | friend字段为array |
children map<string, int> | children字段为map |
address struct<street:string, city:string> | address字段为struct |
fields terminated by ‘,’ | 各字段之间用逗号分割 |
collection items terminated by ‘_’ | 各值之间用下划线分割 |
lines terminated by ‘\n’ | 各行之间用回车分割 |
③导入数据到hive表
load data local inpath '/opt/module/hive/datas/personInfo.txt' into table personinfo;
④查看数据
对于map的查询,直接是 字段[key]
对于array的查询,使用 字段[index]
对于struct的查询,使用 字段.key
select
friends[1],
students['suwukong'],
address.city
from personinfo
where name="tangseng";
3、类型转换
① Hive的基本数据类型是可以进行隐式转换的,类似于Java的类型转换
例如:某表达式使用INT类型,TINYINT会自动转换为INT类型
但是Hive不会进行逆向转换,比如INT类型不会自动转换为TINYINT类型,如果想要这种你想转换,需要使用CAST进行强转操作
CAST的使用
CAST('1' AS INT)
将字符’1’转换为整型INT,如果转换失败,则返回NULL
②隐式转换的规则
何整数类型都可以隐式地转换为一个范围更广的类型,如INT可以转换成BIGINT。
所有整数类型、FLOAT和STRING类型都可以隐式地转换成DOUBLE。
TINYINT、SMALLINT、INT都可以转换为FLOAT。
BOOLEAN类型不可以转换为任何其它的类型。
③自动转换和强转的区别
当自动转换时,如果两个类型可以转换为同一个类型,比如TINYINT和INT都可以隐式转换为FLOAT,则返回结果为FLOAT,如果强转,则就会返回想要的转换结果
select '1'+2, CAST('1' as INT)+2;
如果转换不了,就会返回NULL
如果是自动转换,就会报错