基本数据类型
| 数据类型 | 长度 | 说明 | java类型 |
|---|---|---|---|
| TINYINT | 1byte | 有符号整数 | byte |
| SMALINT | 2byte | 有符号整数 | short |
| INT | 4byte | 有符号整数 | int |
| BIGINT | 8byte | 有符号整数 | long |
| BOOLEAN | 布尔类型,TRUE 和 FALSE | boolean | |
| FLOAT | 4byte | 单精度浮点数 | float |
| DOUBLE | 8byte | 双精度浮点数 | double |
| STRING | 字符串,单引号或者双引号括起来,如:'李雷' 或 "李雷" |
string | |
| TIMESTAMP | 时间戳。详见下面 | ||
| BINARY | 字节数组 |
常用:INT、BIGINT、DOUBLE、STRING
STRING
对于 Hive 的 String 类型相当于 关系型数据库的 varchar 类型,该类型是一个可变的字符串
但是,不能指定 最多存储多少个字符,理论上可以存储 2GB 的字符数
TIMESTAMP
TIMESTAMP表示的是 UTC时间 。
可以是 整数,浮点数或者字符串。
例如:
1327882394,整数,距离UNIX新纪元时间(1970年1月1日,午夜12点)的秒数1327882394.123456789,浮点数,距离UNIX新纪元时间(1970年1月1日,午夜12点)的秒数,小数点后面是纳秒"2016-03-13 16:23:30.123456789",字符串,是java.sql.Timestamp时间格式
时区
Hive本身提供了不同时区间互相转换的内置函数,也就是 to_utc_timestamp 函数和from_utc_timestamp 函数。
集合数据类型
ARRAY
相当于 java 数组,可通过 [索引] 访问
MAP
MAP 是一组 key/value对 集合,相当于 java 中的Map,或 json,可通过[key]访问value
STRUCT
和 c 语言中的 struct 类似(相当于 java 语言中的 java bean)
可以通过 . 符号访问元素内容。
与 MAP 区别: MAP 类型的 key 可变,STRUCT 中的名字是固定的
ARRAY 例子
建表
create table std_array(name string,likes array<string>)
row format delimited
fields terminated by ','
collection items terminated by'-';
创建数据文件
vim array_data.txt
内容如下:
李雷,王者荣耀-抖音-干饭
韩梅梅,睡觉-抖音-干饭
lucy,旅游-拍抖音
注意: 数据格式,与建表指定的格式相同
上传
hadoop fs -put array_data.txt /user/hive/warehouse/std_array
查询所有列
select * from std_array;
执行结果:
李雷 ["王者荣耀","抖音","干饭"]
韩梅梅 ["睡觉","抖音","干饭"]
lucy ["旅游","拍抖音"]
通过索引查询
select name,likes[2] from std_array;
执行结果:
李雷 干饭
韩梅梅 干饭
lucy NULL
MAP 例子
建表
create table std_map(name string,info map<string,string>)
row format delimited
fields terminated by ','
collection items terminated by'-'
map keys terminated by ':';
解释:
,:列分隔符-:集合中的元素用-分隔,如:MAP 中key:value之间分隔符::key、value分隔符
创建数据文件
vim map_data.txt
内容如下:
李雷,age:20-sex:1-height:175
韩梅梅,age:19-sex:0-height:165-phone:138-city:北京
lucy,age:20-sex:0-height:168-country:美国-sister:lili
注意: 数据格式,与建表指定的格式相同
上传
hadoop fs -put map_data.txt /user/hive/warehouse/std_map
查询所有列
select * from std_map;
执行结果:
李雷 {"age":"20","sex":"1","height":"175"}
韩梅梅 {"age":"19","sex":"0","height":"165","phone":"138","addr":"北京"}
lucy {"age":"20","sex":"0","height":"168","addr":"美国","sister":"lili"}
通过key查询
select name,info['age'] from std_map;
执行结果:
李雷 20
韩梅梅 19
lucy 20
通过key查询
select name,info['addr'] from std_map;
李雷 NULL
韩梅梅 北京
lucy 美国
STRUCT例子
建表
create table std_struct(name string,addr struct<street:string, city:string>)
row format delimited
fields terminated by ','
collection items terminated by'-';
解释:
,:列分隔符-:集合中的元素用-分隔,如:MAP 中key:value之间分隔符
创建数据文件
vim struct_data.txt
内容如下:
李雷,北京大街100号-长春
韩梅梅,人民大街200号-北京
lucy,皇后大道99号-纽约
注意: 数据格式,与建表指定的格式相同
与 MAP 区别
STRUCT 格式是固定的
MAP 格式中的 key 不是固定的
上传
hadoop fs -put struct_data.txt /user/hive/warehouse/std_struct
查询所有列
select * from std_struct;
执行结果:
李雷 {"street":"北京大街100号","city":"长春"}
韩梅梅 {"street":"人民大街200号","city":"北京"}
lucy {"street":"皇后大道99号","city":"纽约"}
通过名字查询
select name,addr.city from std_struct;
执行结果:
李雷 长春
韩梅梅 北京
lucy 纽约