返回 导航

大数据

hangge.com

Hive - 快速入门教程3(基本数据类型、复杂数据类型详解)

作者:hangge | 2024-09-11 09:11
    在 Hive 中,数据类型是定义表中列的重要组成部分。Hive 除了支持整数、浮点数、字符串等许多基本数据类型外,还支持一些复杂数据类型,用于处理结构化和嵌套的数据。

一、基本数据类型

1,整数类型

(1)具体类型如下:
  • TINYINT:一个字节有符号整数,范围为 -128 127
  • SMALLINT:两个字节有符号整数,范围为 -3276832767
  • INT:四个字节有符号整数,范围为 -21474836482147483647
  • BIGINT:八个字节有符号整数,范围为 -92233720368547758089223372036854775807

(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 中的 STRINGVARCHAR 类型都可以支持字符串数据。如果是中文字符串,则建议使用 STRING。使用 VARCHAR 存储中文字符串,在查询时容易出现中文乱码问题。

(2)各类型开始支持的版本:
  • STRING:从一开始就支持
  • VARCHAR(n):从 0.12.0 版本开始支持
  • CHAR(n):从 0.13.0 版本开始支持

6,布尔值类型

(1)BOOLEAN 表示逻辑布尔值,只能取两个值之一:TRUEFALSE
(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';

load data local inpath '/usr/local/t1.txt' into table 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';

load data local inpath '/usr/local/t1.txt' into table 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';

load data local inpath '/usr/local/t1.txt' into table stu3;

select * from stu3;

  • 查看所有学生户籍所在的城市:
select id, name, address.home_addr from stu3;
评论

全部评论(0)

回到顶部