基本数据类型
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.14 |
DOUBLE | double | 双精度浮点数 | 3.14 |
STRING | string | 字符型。可以指定字符集,可以使用单引号或者双引号 | ‘test’、”test” |
TIMESTAMP | 时间类型 | ||
BINARY | 字节数组 |
对于Hive的String类型,相当于数据库的varchar类型,该类型是一个可变的字符串,不过它不能声明其中最多能存储多少个字符,理论上可以存储2GB的字符。
集合数据类型
数据类型 | 描述 | 示例 |
---|---|---|
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 | 数组时一组具有相同类型和名称的变量的集合。这些变量称为数组的元素,每个数组元素都有一个编号,编号从0开始。 例如:数组值为 ['John', 'Doe'] ,那么第2个元素可以通过 数组名[1] 获取 |
Array() 例如: array<string> |
Hive有3中复杂数据类型:Array、Map 和 Struct。但是一般并不常用。
建表和查询
例如,一段数据格式为:
{
"name": "zhangsan",
"friends": ["lisi", "wangwu"], // 列表
"chidren": {
"xiao zhangsan": 18, // key-value
"xiaoxiao zhangsan": 19
},
"address": { // struct
"street": "dehuajie",
"city": "zhengzhou"
}
}
在数据文件中保存的格式为:
字段间以逗号
,
分隔;数组等格式的同一个字段的多个值之间使用下划线
_
分隔;map的键值之间使用冒号
:
分隔;换行符为
\n
zhangsan,lisi_wangwu,xiao zhangsan:18_xiaoxiao zhangsan:19,dehuajie_zhengzhou
John,Jack_Mike,xiao John:14_xiaoxiao John:10,manhattan_newyork
创建表:
指定表名、字段名、字段类型、文件中的各种分隔符
create table test3(
name string,
friends array<string>,
children map<string,int>,
address struct<street:string, city:string>
)
-- 数据行的格式定义
row format delimited
-- 字段间分隔符
fields terminated by ','
-- 数组集合类型的多个元素之间分隔符
collection items terminated by '_'
-- map的keyvalue之间分隔符
map keys terminated by ':'
-- 换行符,默认的就是\n
lines terminated by '\n';
创建表之后,将上面的数据文件上传到/user/hive/warehouse/test3
目录:
hadoop fs -put test.txt /user/hive/warehouse/test3
然后便可以查看test3
表的数据:
-- 查看test3表所有数据
select * from test3;
-- 获取friends字段的第一个元素
select friends[0] from test3;
-- 访问map中的指定键值
select children['xiao zhangsan'] from test3 ;
-- 访问结构体中的指定属性
select address.street from test3 ;
类型转化
Hive的原子数据类型可以进行隐式转换,类似于Java的类型转换。例如某个表达式使用INT
类型,TINYINT
会自动转换为INT
类型,但是Hive不会将长类型向短类型转化,例如不会将INT
自动转换为TINYINT
类型,会返回错误,除非使用CAST
操作。
隐式类型转换的规则:
- 任何整数类型都可以隐式转换为一个范围更广的类型,如
TINYINT
可以转换为INT
,INT
可以转换为BIGINT
- 所有整数类型、
FLOAT
和数字样式的STRING
都可以隐式转换为DOUBLE
TINYINT
、SMALLINT
、INT
都可以转换为FLOAT
BOOLEAN
类型不可以转换为任何其他类型
可以使用CAST
操作显式进行数据类型转换:
例如 CAST('1' as INT)
可以将字符串'1'
转换成整数1
。如果强制类型转换失败,如执行CAST('X' as INT)
,表达式会返回空值NULL
。
select '1' + 2 , cast('1' as int) + 2;