Hive - 快速入门教程3(基本数据类型、复杂数据类型详解)
作者:hangge | 2024-09-11 09:11
在 Hive 中,数据类型是定义表中列的重要组成部分。Hive 除了支持整数、浮点数、字符串等许多基本数据类型外,还支持一些复杂数据类型,用于处理结构化和嵌套的数据。
一、基本数据类型
1,整数类型
(1)具体类型如下:
- TINYINT:一个字节有符号整数,范围为 -128 到 127。
- SMALLINT:两个字节有符号整数,范围为 -32768 到 32767。
- INT:四个字节有符号整数,范围为 -2147483648 到 2147483647。
- BIGINT:八个字节有符号整数,范围为 -9223372036854775808 到 9223372036854775807。
(2)各类型开始支持的版本:
- TINYINT:从一开始就支持
- SMALLINT:从一开始就支持
- INT:从一开始就支持
- BIGINT:从一开始就支持
2,浮点数类型
(1)具体类型如下:
- FLOAT:单精度浮点数。
- DOUBLE:双精度浮点数。
(2)各类型开始支持的版本:
- FLOAT:从一开始就支持
- DOUBLE:从一开始就支持
3,精确数值类型
(1)DECIMAL 是一种用于表示精确小数的数据类型,而不是浮点数。主要用来处理那些对于精确度要求较高的数值,例如货币金额。
(2)DECIMAL 从 0.11.0 版本开始支持。
4,日期和时间类型
(1)具体类型如下:
- DATE:日期类型。
- TIMESTAMP:时间戳类型。
(2)各类型开始支持的版本:
- DATE:从 0.8.0 版本开始支持
- TIMESTAMP:从 0.12.0 版本开始支持
5,字符串类型
(1)具体类型如下:
- STRING:可变长度字符串。
- VARCHAR(n):可变长度字符串,最大长度为 n。
- CHAR(n):定长字符串,长度为 n。
注意:Hive 中的 STRING 和 VARCHAR 类型都可以支持字符串数据。如果是中文字符串,则建议使用 STRING。使用 VARCHAR 存储中文字符串,在查询时容易出现中文乱码问题。
(2)各类型开始支持的版本:
- STRING:从一开始就支持
- VARCHAR(n):从 0.12.0 版本开始支持
- CHAR(n):从 0.13.0 版本开始支持
6,布尔值类型
(1)BOOLEAN 表示逻辑布尔值,只能取两个值之一:TRUE 或 FALSE
(2)BOOLEAN 从一开始就支持。
二、复杂数据类型
1,数组(Array)
(1)ARRAY 适合存储元素个数不固定的同类数据。该类型从 0.14.0 版本开始支持。
(2)例如可以使用 ARRAY 数据类型存储用户的兴趣爱好。
- 假设用户的兴趣爱好测试数据 t1.txt 内容如下:
- 创建表 stu,在表中定义一个 ARRAY 类型的字段 favors。建表语句如下:
注意:ARRAY 类型的字段中可以存储多个元素,元素之间的分隔符通过 collection itemsterminated by 指定。
create table stu( id int, name string, favors array<string> ) row format delimited fields terminated by '\t' collection items terminated by ',' lines terminated by '\n';
- 然后将 t1.txt 文件加载到表 stu 中:
load data local inpath '/usr/local/t1.txt' into table stu;
- 查看表 stu 中的数据:
select * from stu;
- 查看学生的一个兴趣爱好:
注意:ARRAY 数据类型的角标是从 0 开始的,如果指定的角标不存在则返回 NULL。
select id, name, favors[0] from stu;
2,映射(Map)
(1)MAP 适合存储多组 K-V 键值对类型的元素。该类型从 0.14.0 版本开始支持。
(2)例如可以使用 MAP 数据类型存储学生的考试成绩信息,将学生的多门考试成绩信息存储到一个字段中,方便管理和使用,也可以兼容后期新增考试科目的需求。
- 假设学生的考试成绩测试数据 t1.txt 内容如下:
- 首先创建表 stu2,在表中定义一个 MAP 类型的字段 scores。建表语句如下:
注意:在 MAP 类型的字段中可以存储多个 K-V 类型的元素,在建表语句中只需要指定 K-V 的数据类型即可。通过 collection items terminated by 指定 MAP 中多个元素之间的分隔符,通过 map keys terminated by 指定 K-V 之间的分隔符。
create table stu2( id int, name string, scores map<string, int> ) row format delimited fields terminated by '\t' collection items terminated by ',' map keys terminated by ':' lines terminated by '\n';
- 接着 t1.txt 文件加载到表 stu2 中:
load data local inpath '/usr/local/t1.txt' into table stu2;
- 查看表 stu2 中的数据:
select * from stu2;
- 查看所有学生的语文和数学成绩:
select id, name, scores['chinese'], scores['math'] from stu2;
3,结构体(Struct)
(1)STRUCT 适合存储固定数量的 K-V 类型元素。该类型从一开始就支持。
MAP 和 STRUCT 数据类型对比:
- 总体而言还是 MAP 比较灵活,但是它会额外占用一半左右的磁盘空间,因为它比 STRUCT 多存储了元素的 K。
- STRUCT 只需要存储元素的 V,比较节省空间,但是灵活性有限,后期无法动态增加 K-V。
(2)例如可以使用 STRUCT 类型存储学生的地址信息,包括户籍所在的城市和公司所在的城市。
- 假设学生的地址信息测试数据 t1.txt 内容如下:
- 首先创建表 stu3,在表中定义一个 STRUCT 类型的字段 address。建表语句如下:
注意:在 STRUCT 类型的字段中需要存储固定数量的 K-V 类型元素,所以在建表语句中需要明确指定所有 K 的名称和 V 的类型。在数据文件中只需要存储元素的 V 即可,通过 collection items terminated by 指定多个元素之间的分隔符。
create table stu3( id int,name string, address struct<home_addr:string, office_addr:string> ) row format delimited fields terminated by '\t' collection items terminated by ',' lines terminated by '\n';
- 接着 t1.txt 文件加载到表 stu3 中:
load data local inpath '/usr/local/t1.txt' into table stu3;
- 查看表 stu3 中的数据:
select * from stu3;
- 查看所有学生户籍所在的城市:
select id, name, address.home_addr from stu3;
全部评论(0)