基本数据类型
| 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_zhengzhouJohn,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 ':'-- 换行符,默认的就是\nlines 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都可以转换为FLOATBOOLEAN类型不可以转换为任何其他类型
可以使用CAST操作显式进行数据类型转换:
例如 CAST('1' as INT) 可以将字符串'1'转换成整数1。如果强制类型转换失败,如执行CAST('X' as INT),表达式会返回空值NULL。
select '1' + 2 , cast('1' as int) + 2;
