hive教程:数据类型

基本数据类型

数据类型 长度 说明 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    纽约

原文出处:/show_1IXkL6t2ftX.html