Hive decimal类型详解
Hive 中的 DECIMAL 类型基于 Java 的 BigDecimal,它用于在 Java 中表示不可变的任意精度十进制数。 所有常规数字运算(例如 +、-、*、/
)和相关的 UDF(例如 Floor、Ceil、Round 等)都处理 decimal 类型。 可以像处理其他数字类型一样进行 decimal 类型的转换。 decimal 类型的持久化格式同时支持科学和非科学记数法。 因此,无论是4.004E+3(科学记数法)或 4004(非科学记数法)或两者的组合,都可以使用 DECIMAL。
- Hive 0.11 和 0.12,DECIMAL 类型具有固定的精度(precision),限制为 38 位。
- 从 Hive 0.13 开始,用户可以使用
DECIMAL(precision, scale)
语法创建指定比例和精度的 DECIMAL 数据类型。 如果未指定scale,则默认为 0(无小数位)。 如果未指定precision,则默认为 10。
CREATE TABLE foo (a DECIMAL, -- Defaults to decimal(10,0)b DECIMAL(9, 7)
)
1. 使用误区(补充)
decimal(10,2)
表示精度为10,比例为2的十进制数。其中2控制小数位数(小数不足末位用0补齐),即整型部分最多可以有8位,小数点并不占用位数。
简单说就是整数位+小数位<=10
的十进制数。
-- 如下示例,整数部分超过了8位,结果为NULL
-- 因为保留两位小数后,整体位数为11位,超过了精度10,因此如下结果null
> select CAST(333333333.3 AS DECIMAL(10,2)) as r;
+-------+
| r |
+-------+
| NULL |
+-------+-- 如下示例,整数部分为8位,小数部分很多位,但是仍然可以转换为decimal(10,2)类型,
-- 因为即使小数后很多位,但是只保留2位小数,转换后的结果为8位整数+2位小数部分,符合精度为10
> select CAST(33333333.3333333333333 AS DECIMAL(10,2)) as r;
+--------------+
| r |
+--------------+
| 33333333.33 |
+--------------+-- 正常转化为decimal类型
> select CAST(3333.3333333333333 AS DECIMAL(10,2)) as r;
+----------+
| r |
+----------+
| 3333.33 |
+----------+
注意:将一个数字类型的字面量转换成decimal类型,要保证整数部分的位数必须<=(精度-比例),否则结果为NULL。
2. Decimal Literals
大于 BIGINT 的整型字面量必须使用 Decimal(38,0)
处理。 且必须以BD结尾。 例子:
select CAST(18446744073709001000BD AS DECIMAL(38,0)) from my_table limit 1;
3. Hive 0.12.0 和 0.13.0 之间的Decimal类型不兼容
随着 Hive 0.13.0 中 Decimal 数据类型的更改,Hive 0.13.0 之前的decimal类型的列将被视为decimal(10,0)
类型。 这意味着从这些表中读取的现有数据将被视为 10 位整数值,写入这些表的数据将在写入之前转换为 10 位整数值。 为避免这些问题,在升级到 Hive 0.13.0 或更高版本后,使用包含 Decimal 列的表的 0.12 或更早版本的 Hive 用户将需要迁移他们的表。
4. Floating Point Types
浮点文字被假定为 DOUBLE
。 尚不支持科学记数法。
Decimal类型字面量为浮点数提供了比 DOUBLE 类型更精确的值和更大的范围。 decimal 数据类型存储数值的精确表示,而 DOUBLE 数据类型存储数值的非常接近的近似值。
5. Casting Decimal Values
decimal值和任何其他原始类型(如整数、双精度、布尔值等)之间支持强制转换。