Hive数据类型

本文介绍了Hive的各种数据类型,包括基本数据类型如TINYINT、STRING和TIMESTAMP,以及集合数据类型如STRUCT、MAP和ARRAY。文章还详细讨论了Hive的数据类型转换,包括自动类型转换和手动强制转换,特别提到了隐式转换的规则和如何使用CAST函数进行转换。对于实际遇到的问题,如字符串数据排序错误,可以通过将字符串转换为INT类型来解决。

Hive基本数据类型

Hive支持的基本数据类型有:
TINKYINT
SMALLINT
INT
BIGINT
BOOLEAN
FLOAT
DOUBLE
STRING
TIMESTAMP

Hive集合数据类型

STRUCT
MAP
ARRAY

Hive数据类型转换

hive执行隐形转换,比如查询一张表的某个字段SMALLINT类型的数据,插入另一张表的INT类型的字段,那么这个过程是可以隐式转换的,不需要我们自己转换,但INT类型不能隐式转换程SMALLINT。即范围小的可以转换为范围大的。

Hive官方文档给出了隐式转换的规则:
在这里插入图片描述

Hive自动类型转换

参数hive.metastore.disallow.incompatible.col.type.changes默认为false,如果设置为true,则类型会按根据上表,如果转换类型是允许的,则数据会正常显示,否则显示为NULL。

Hive手动强制数据类型转换

通过CAST函数,可以实现类型转换。
今天之前遇到一种情况,数据类型定义的字符串,实际数据存储的是数字,排序的时候按这个字段排序,则用的是字符序列,因此就会造成9,81,7,34,这种排序结果。
这是通过CAST(‘column’ as ‘INT’)先转换为INT类型,再排序就可以得到正确结果。

注意: 浮点型数据转换为整型,用的是round()或者floor()实现

更多类型转换操作可以参考官方文档:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types

### Hive 数据类型概述 Hive 支持多种数据类型,这些数据类型可以分为 **原始数据类型** 和 **复杂数据类型**。以下是详细的分类及其用法: #### 原始数据类型 (Primitive Data Types) 1. **数值类型** - 整数类型:`TINYINT`, `SMALLINT`, `INT`, `BIGINT` 表示不同范围的整数[^2]。 - 小数类型:`FLOAT`, `DOUBLE`, `DECIMAL(precision, scale)` 用于表示浮点数和高精度小数。 2. **字符串类型** - 文本类型:`STRING`, `VARCHAR(length)`, `CHAR(length)` 用于存储字符数据。 3. **日期和时间类型** - 时间戳类型:`TIMESTAMP` 存储精确到毫秒的时间值。 - 日期类型:`DATE` 只存储年月日部分。 4. **布尔类型** - `BOOLEAN` 类型用于逻辑判断,取值为 `TRUE` 或 `FALSE`。 5. **二进制类型** - `BINARY` 用于存储字节序列数据。 --- #### 复杂数据类型 (Complex Data Types) 1. **数组 (ARRAY)** 数组是一种有序集合,允许重复元素。定义方式如下: ```sql ARRAY<element_type> ``` 插入和操作数组的例子: ```sql CREATE TABLE array_example (arr ARRAY<int>); INSERT INTO array_example VALUES (array(1, 2, 3)); SELECT arr FROM array_example; ``` 2. **映射 (MAP)** 映射是一个键值对集合,键必须唯一且不可为空。定义方式如下: ```sql MAP<key_type, value_type> ``` 示例代码: ```sql CREATE TABLE map_example (mymap MAP<string,int>); INSERT INTO map_example VALUES (map('a', 1, 'b', 2)); SELECT mymap['a'] FROM map_example; ``` 3. **结构体 (STRUCT)** 结构体是一组命名字段的组合,类似于对象模型中的类实例。定义方式如下: ```sql STRUCT<col_name : col_type [, ...]> ``` 示例代码: ```sql CREATE TABLE struct_example (mystruct STRUCT<a:int,b:string>); INSERT INTO struct_example VALUES (named_struct('a', 1, 'b', 'test')); SELECT mystruct.a FROM struct_example; ``` 4. **联合类型 (UNIONTYPE)** 联合类型允许多种可能的数据类型共存于同一列中,但在任何时刻只有一种类型有效。定义方式如下: ```sql UNIONTYPE<data_type1, data_type2, ..., data_typen> ``` 创建表并插入数据的示例: ```sql CREATE TABLE union_test ( foo UNIONTYPE<int, double, array<string>, struct<a:int,b:string>> ); -- 插入整数类型 INSERT INTO union_test VALUES (0:{1}); -- 插入双精度浮点数类型 INSERT INTO union_test VALUES (1:{1.5}); -- 插入数组类型 INSERT INTO union_test VALUES (2:{"apple", "banana"}); -- 插入结构体类型 INSERT INTO union_test VALUES (3:{'a':1,'b':'hello'}); ``` --- #### 类型转换 Hive 提供两种主要的类型转换机制: 1. **隐式转换** 在某些场景下,Hive 自动完成类型转换,例如在数学运算中将较小的整数类型提升为较大的整数或浮点类型[^3]。 2. **显式转换 (CAST 函数)** 当需要手动控制类型转换时,可使用 `CAST` 函数。语法如下: ```sql CAST(expression AS target_data_type) ``` 示例: ```sql SELECT CAST('123' AS INT); ``` --- ### 总结 Hive数据类型涵盖了常见的原始类型以及复杂的嵌套类型,能够满足多样化的数据分析需求。无论是简单的数值计算还是复杂的嵌套结构处理,Hive 都能提供灵活的支持。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值