基本数据类型

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。但是一般并不常用。

建表和查询

例如,一段数据格式为:

  1. {
  2. "name": "zhangsan",
  3. "friends": ["lisi", "wangwu"], // 列表
  4. "chidren": {
  5. "xiao zhangsan": 18, // key-value
  6. "xiaoxiao zhangsan": 19
  7. },
  8. "address": { // struct
  9. "street": "dehuajie",
  10. "city": "zhengzhou"
  11. }
  12. }

在数据文件中保存的格式为:

字段间以逗号,分隔;

数组等格式的同一个字段的多个值之间使用下划线_分隔;

map的键值之间使用冒号:分隔;

换行符为\n

  1. zhangsan,lisi_wangwu,xiao zhangsan:18_xiaoxiao zhangsan:19,dehuajie_zhengzhou
  2. John,Jack_Mike,xiao John:14_xiaoxiao John:10,manhattan_newyork

创建表:

指定表名、字段名、字段类型、文件中的各种分隔符

  1. create table test3(
  2. name string,
  3. friends array<string>,
  4. children map<string,int>,
  5. address struct<street:string, city:string>
  6. )
  7. -- 数据行的格式定义
  8. row format delimited
  9. -- 字段间分隔符
  10. fields terminated by ','
  11. -- 数组集合类型的多个元素之间分隔符
  12. collection items terminated by '_'
  13. -- mapkeyvalue之间分隔符
  14. map keys terminated by ':'
  15. -- 换行符,默认的就是\n
  16. lines terminated by '\n';

创建表之后,将上面的数据文件上传到/user/hive/warehouse/test3目录:

  1. hadoop fs -put test.txt /user/hive/warehouse/test3

然后便可以查看test3表的数据:

  1. -- 查看test3表所有数据
  2. select * from test3;
  3. -- 获取friends字段的第一个元素
  4. select friends[0] from test3;
  5. -- 访问map中的指定键值
  6. select children['xiao zhangsan'] from test3 ;
  7. -- 访问结构体中的指定属性
  8. select address.street from test3 ;

image.png

类型转化

Hive的原子数据类型可以进行隐式转换,类似于Java的类型转换。例如某个表达式使用INT类型,TINYINT会自动转换为INT类型,但是Hive不会将长类型向短类型转化,例如不会将INT自动转换为TINYINT类型,会返回错误,除非使用CAST操作。

隐式类型转换的规则:

  • 任何整数类型都可以隐式转换为一个范围更广的类型,如TINYINT可以转换为INTINT可以转换为BIGINT
  • 所有整数类型、FLOAT和数字样式的STRING都可以隐式转换为DOUBLE
  • TINYINTSMALLINTINT都可以转换为FLOAT
  • BOOLEAN类型不可以转换为任何其他类型

可以使用CAST操作显式进行数据类型转换:

例如 CAST('1' as INT) 可以将字符串'1'转换成整数1。如果强制类型转换失败,如执行CAST('X' as INT),表达式会返回空值NULL

  1. select '1' + 2 , cast('1' as int) + 2;