Hive 数据类型

Hive 是一个基于 Hadoop 的数据仓库工具,它提供了一个 SQL 接口来查询和分析大规模的数据集。在 Hive 中,数据类型是非常重要的,因为它决定了数据如何存储和处理。

本文将介绍 Hive 支持的数据类型,并提供相关的代码示例。

一、Hive 基本数据类型

Hive 支持多种基本数据类型,包括整数、浮点数、字符串和布尔值等。下面是一些常用的基本数据类型:

  • TINYINT: 一个字节大小的有符号整数,取值范围为 -128 到 127。
  • SMALLINT: 二个字节大小的有符号整数,取值范围为 -32768 到 32767。
  • INT: 四个字节大小的有符号整数,取值范围为 -2147483648 到 2147483647。
  • BIGINT: 八个字节大小的有符号整数,取值范围为 -9223372036854775808 到 9223372036854775807。
  • BOOLEAN: 一个布尔值,只能取 true 或 false。
  • FLOAT: 单精度浮点数,占用四个字节。
  • DOUBLE: 双精度浮点数,占用八个字节。
  • STRING: 字符串类型,可以存储任意长度的字符数据。
  • TIMESTAMP: 时间戳类型,表示日期和时间的组合。
  • DATE: 日期类型,表示年、月、日。

下面是一个创建表并插入数据的示例:

```sql
CREATE TABLE students (
    id INT,
    name STRING,
    age INT,
    gender STRING,
    gpa FLOAT
);

INSERT INTO students VALUES (1, 'Alice', 20, 'Female', 3.8);
INSERT INTO students VALUES (2, 'Bob', 22, 'Male', 3.6);
INSERT INTO students VALUES (3, 'Charlie', 21, 'Male', 3.4);
INSERT INTO students VALUES (4, 'Diana', 22, 'Female', 3.9);

## 二、Hive 复杂数据类型

除了基本数据类型,Hive 还支持一些复杂的数据类型,包括数组、结构体和映射等。下面是一些常用的复杂数据类型:

- ARRAY: 数组类型,存储相同类型的数据集合。
- STRUCT: 结构体类型,存储不同类型的字段和值。
- MAP: 映射类型,存储键值对。

下面是一个使用复杂数据类型的示例:

```markdown
```sql
CREATE TABLE employees (
    id INT,
    name STRING,
    address STRUCT<street:STRING, city:STRING, state:STRING>,
    skills ARRAY<STRING>,
    salary MAP<STRING, FLOAT>
);

INSERT INTO employees VALUES (1, 'Alice', named_struct('street', '123 Main St', 'city', 'New York', 'state', 'NY'), array('Java', 'Python', 'SQL'), map('2019', 50000.0, '2020', 55000.0));
INSERT INTO employees VALUES (2, 'Bob', named_struct('street', '456 Elm St', 'city', 'San Francisco', 'state', 'CA'), array('C++', 'JavaScript', 'HTML'), map('2019', 60000.0, '2020', 65000.0));
INSERT INTO employees VALUES (3, 'Charlie', named_struct('street', '789 Oak St', 'city', 'Chicago', 'state', 'IL'), array('Scala', 'R', 'Hadoop'), map('2019', 70000.0, '2020', 75000.0));

## 三、Hive 自定义数据类型

除了内置的数据类型,Hive 还支持自定义数据类型。通过自定义数据类型,我们可以根据特定的需求定义自己的数据类型。下面是一个使用自定义数据类型的示例:

```markdown
```sql
CREATE TYPE my_type AS STRUCT<
    name: STRING,
    age: INT
>;

CREATE TABLE my_table (
    id INT,
    info my_type
);

INSERT INTO my_table VALUES (1, named_struct('name', 'Alice', 'age', 20));
INSERT INTO my_table VALUES (2, named_struct('name', 'Bob', 'age', 22));
INSERT INTO my_table VALUES (3, named_struct('name', 'Charlie', 'age', 21));

## 四、总结

在 Hive