Hive 数据类型:如何在 Hive 中创建和删除数据库

⚡ 智能摘要

Hive 数据类型定义了每个表列可以包含的内容,而 CREATE DATABASE 和 DROP DATABASE 命令设置或删除这些表在 Hive 元数据存储中所在的命名空间。

  • 🔢 数字类型: TINYINT 到 BIGINT 涵盖整数,而 DECIMAL(精度,比例)可以保持 FLOAT 和 DOUBLE 无法保持的精确值。
  • 🔤 字符串类型: STRING 没有声明限制,VARCHAR 接受 1 到 65535 个字符,而 CHAR 固定为最多 255 个字符。
  • 📅 日期和时间: DATE 存储的是 YYYY-MM-DD 的简单值,TIMESTAMP 在此基础上增加了可选的纳秒精度。
  • 🧩 复杂类型: ARRAY、MAP、STRUCT 和 UNIONTYPE 将多个相关值打包到一个列中,而不是多个列。
  • ????️ 创建数据库: CREATE DATABASE 在元数据存储中注册一个命名空间,SHOW DATABASES 确认该命名空间是否存在。
  • 🗑️ 删除数据库: DROP DATABASE 会删除命名空间,如果表仍然位于该命名空间内,则需要 CASCADE。

Hive 数据类型以及如何在 Hive 中创建和删除数据库

数据类型是 Hive 查询语言和数据建模中非常重要的元素。要定义表列类型,我们必须了解数据类型及其用法。

以下简要概述了 Hive 中存在的一些数据类型:

  • 数字类型
  • 字符串类型
  • 日期/时间类型
  • 复杂类型

Hive 中的数据类型

Hive 中的每个列都使用以下类型之一进行声明。最前面是基本类型,后面是复杂类型,复杂类型可以在单个列中存储多个值。

Hive 数值数据类型

数值列的大小范围从 1 个字节到 8 个字节,因此选择适合这些值的最小类型可以降低存储成本和扫描成本。

类型 内存分配
微信 1字节有符号整数(-128至127)
小灵通 2字节有符号整数(-32,768至32,767)
INT 4字节有符号整数(-2,147,483,648至2,147,483,647)
大数据 8字节有符号整数(-9,223,372,036,854,775,808至9,223,372,036,854,775,807)
FLOAT 4字节单精度浮点数
双盒套装 8 字节双精度浮点数
DECIMAL 我们可以在这个类型中定义精度和小数位数,格式为 DECIMAL(精度, 小数位数)。如果省略它们,Hive 将使用 DECIMAL(10,0)。

Hive 字符串数据类型

字符列有三种形式,区别在于 Hive 是否强制执行声明的长度。

类型 长度
CHAR 固定长度,最多 255 个字符。不足 255 个字符的部分将用空格填充。
变量 长度为 1 到 65,535 个字符。超过此长度的值将被自动截断。
STRING 我们可以在这里定义长度(没有限制)。

Hive 日期/时间数据类型

时间列的存储不包含任何时区偏移,在比较不同集群写入的值之前,这一点值得记住。

类型 用法
时间戳 支持传统 Unix的 可选纳秒精度的时间戳
日期 格式为YYYY-MM-DD。
Date 类型支持的值范围为 0000-01-01 到 9999-12-31,具体取决于原始数据的支持情况。 Java 典型日期

Hive 杂项数据类型

还有两种基本类型不属于数值、字符串和日期类型,但在实际模式中经常出现。

类型 用法
布尔 存储真或假
BINARY 存储字节数组,这样可以将原始内容排除在 STRING 列之外。

Hive 复杂数据类型

复杂类型将值嵌套在一列中,这样就省去了关系设计中需要的额外连接。

类型 用法
阵列 大批
不允许使用负值和非恒定表达式
地图 地图
不允许使用负值和非恒定表达式
结构 结构
工会 联合类型

Hive复杂数据类型示例

上表给出了声明形式。下面的语句将三种复杂类型放在一个表中,以便将分隔符子句和访问语法放在一起查看。

CREATE TABLE employees (
  name      STRING,
  skills    ARRAY<STRING>,
  deductions MAP<STRING, FLOAT>,
  address   STRUCT<street:STRING, city:STRING, pin:INT>
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;

这里需要三个不同的分隔符:一个用于分隔列,第二个用于分隔数组或结构体中的元素,第三个用于分隔映射的键和值。表创建完成后,每个复杂列都使用各自的访问器进行读取。

SELECT name, skills[0], deductions['tax'], address.city
FROM employees;

下表总结了哪些访问器属于哪种类型。

类型 如何读取值
ARRAY 零基指数,例如技能[0]
MAP 方括号内的关键查找,例如 descendions['tax']
结构体 字段名使用点号表示法,例如 address.city
联合类型 由于对其的查询支持尚不完善,因此很少使用。

复杂类型可以嵌套,因此 ARRAY > 是有效的列声明。列布局确定后,就可以使用文中介绍的语句构建表了。 Hive 创建、修改和删除表.

如何在 Hive 中创建和删除数据库

在 Hive 中,数据库本质上是一个用于分组表的命名空间,因此它是所有表操作开始之前需要创建的第一个对象。以下是在 Hive 中创建和删除数据库的步骤。

步骤 1)在 Hive 中创建数据库

要在 Hive shell 中创建数据库,我们需要使用如下语法所示的命令:

语法:

Create database <DatabaseName>

示例:创建数据库“guru99”

下面的屏幕截图显示了创建语句,然后是列出集群上每个数据库的 show 命令。

使用 Hive shell 创建 guru99 数据库并使用 show 命令列出数据库。

从上面的截图中可以看出,我们正在做两件事:

  1. 在 Hive 中创建数据库“guru99”
  2. 使用“show”命令显示现有数据库

在同一屏幕上,执行 show 命令后,数据库“guru99”显示在最后,这意味着数据库“guru99”已成功创建。

步骤 2)删除 Hive 中的数据库

下降ping 在 Hive shell 中,要删除数据库,我们需要使用“drop”命令,语法如下所示:

语法:

Drop database <DatabaseName>

示例:删除数据库 guru99

在下一张截图中,drop 语句首先执行,随后的 show 命令不再列出数据库。

蜂巢外壳掉落ping guru99 数据库并通过 show 确认删除

在上面的截图中,我们正在做两件事:

  1. 我们掉落ping 来自 Hive 的数据库“guru99”。
  2. 使用“show”命令进行交叉验证

在同一屏幕上,使用 show 命令检查数据库后,数据库“guru99”并未出现在 Hive 中。因此,我们现在可以确认数据库“guru99”已被删除。

Hive 数据库命令:USE、DESCRIBE、SHOW 和 ALTER DATABASE

以上两条语句均使用最简形式。文档中提供的语法包含可选子句,用于决定文件存放位置以及名称已被占用时的处理方式。

CREATE DATABASE [IF NOT EXISTS] database_name
  [COMMENT database_comment]
  [LOCATION hdfs_path]
  [WITH DBPROPERTIES (property_name=property_value, ...)];
DROP DATABASE [IF EXISTS] database_name [RESTRICT|CASCADE];

关键字 DATABASE 和 SCHEMA 在全文中可以互换使用,因此 CREATE SCHEMA 和 CREATE DATABASE 执行的操作完全相同。其余命令完善了命名空间的日常操作。

命令 它做什么
显示数据库; 列出元数据存储中注册的所有数据库
使用数据库名称; 设置当前数据库,使表名不需要前缀。
描述数据库 database_name; 报告评论、HDFS 位置和所有者信息
DESCRIBE DATABASE EXTENDED database_name; 将 DBPROPERTIES 键值对添加到该输出中
ALTER DATABASE database_name SET DBPROPERTIES (…); 添加或替换元数据属性
ALTER DATABASE database_name SET OWNER USER user_name; 将所有权转移给其他用户或角色
ALTER DATABASE database_name SET LOCATION hdfs_path; 更改此后创建的表所使用的路径

有两个默认设置值得记住。如果没有 LOCATION 子句,文件将位于仓库目录下,通常是 /user/hive/warehouse/database_name.db;如果没有 IF EXISTS,则对缺失名称的数据库执行删除操作时会引发错误,而不是静默通过。这两个设置都保存在…… Hive Metastore.

Hive 数据类型转换和常见错误

类型并非总是按照声明的方式使用。Hive 会在不会丢失任何信息的情况下自动扩展值,而其他情况则需要显式转换。

  • 隐式扩展遵循 TINYINT 到 SMALLINT 到 INT 到 BIGINT 到 FLOAT 到 DOUBLE 的链,并且保存数字的 STRING 被提升为 DOUBLE。
  • 类型缩减不会自动发生,因此将 DOUBLE 类型赋值给 INT 类型的列需要进行书面转换。
  • CAST 执行该写入转换,当值无法转换时,它返回 NULL 而不是错误。
SELECT CAST(salary AS DECIMAL(10,2)) FROM employees;

以下错误解释了初学者在第一次接触模式时遇到的大部分意外情况。

症状 原因及解决方法
删除操作失败,但数据库中仍然保留着表。 RESTRICT 是默认值。附加 CASCADE 可删除包含该限制的表。
一根长绳被缩短了 VARCHAR 类型会在超出其声明的长度时自动截断。如果不需要限制长度,请使用 STRING 类型。
转换后,某一列的值为 NULL。 CAST 无法解析该值。请在扩展类型之前检查源数据。
货币价值损失了分或美分。 不带参数的 DECIMAL 表示 DECIMAL(10,0)。请明确指定小数位数。
两个看起来完全相同的日期永远不会吻合。 字符串类型的日期和日期类型的列是不同的数据类型。比较之前,请先确定其中一种数据类型。

类型识别完成后,下一步就是加载和查询数据本身,这部分内容将在下文中介绍。 使用 Order By、Group By 和 Hive 查询 Cluster By.

常见问题

不。DATABASE 和 SCHEMA 在 HiveQL 中是可互换的关键字,因此 CREATE SCHEMA sales 和 CREATE DATABASE sales 生成的是同一个元数据存储对象。选择哪种方式纯粹是代码风格的问题。

在仓库目录下,通常位于 HDFS 上的 /user/hive/warehouse/database_name.db。CREATE DATABASE 语句中的 LOCATION 子句会覆盖该路径,而 DESCRIBE DATABASE 语句会报告实际使用的位置。

STRING 是常用的选择,因为它没有声明长度限制,也不需要填充。VARCHAR 适用于必须强制规定长度的情况,而 CHAR 则适合短的固定长度代码,例如国家/地区缩写。

DOUBLE 是二进制浮点数,因此重复求和会产生几分之一的误差。DECIMAL 则以指定的精度和小数位数存储精确值,从而保证每次运行的财务总额都具有可重复性。

普通的 TIMESTAMP 不包含时区信息,读取时会完全按照写入时区进行。Hive 3.1 新增了 TIMESTAMP WITH LOCAL TIME ZONE 类型,该类型在写入时会将值规范化为 UTC 时间,读取时则会进行转换。

是的。STRUCT 可以位于 ARRAY 内部,而 MAP 值本身也可以是 STRUCT,所以 ARRAY 也是 STRUCT。 > 在以下情况下有效 蜂房嵌套过深会使分隔符变得复杂,所以要尽量减少嵌套层数。

是的。数据分析工具会对基数、空值率和值范围进行采样,然后建议最合适的数据类型和文件格式。请将此建议视为草稿,因为模型无法预测未来的工作负载。

Copilot 可以根据简短的注释自动生成 CREATE TABLE 和 CREATE DATABASE 语句,而智能助手可以将示例文件转换为模式。运行结果之前,请务必检查 DECIMAL 小数位数和分隔符子句。

总结一下这篇文章: