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 中创建数据库“guru99”
- 使用“show”命令显示现有数据库
在同一屏幕上,执行 show 命令后,数据库“guru99”显示在最后,这意味着数据库“guru99”已成功创建。
步骤 2)删除 Hive 中的数据库
下降ping 在 Hive shell 中,要删除数据库,我们需要使用“drop”命令,语法如下所示:
语法:
Drop database <DatabaseName>
示例:删除数据库 guru99
在下一张截图中,drop 语句首先执行,随后的 show 命令不再列出数据库。
在上面的截图中,我们正在做两件事:
- 我们掉落ping 来自 Hive 的数据库“guru99”。
- 使用“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.


