【问题标题】:Cast bigint to decimal(18,5) in hive在 hive 中将 bigint 转换为十进制(18,5)
【发布时间】:2019-12-19 01:21:46
【问题描述】:

我正在尝试在 hive 中将 bigint 转换为小数 (18,5),但在转换为小数 (18,5) 后我没有得到任何小数值。

让我们采用下面的 bigint 值

99000
999000
499000
350000
344000000

转换为十进制(18,5)后,我期待下面的内容

0.99000
9.99000
4.99000
3.50000
3440.00000

我正在尝试以下查询。

select col_a, cast(col_a as decimal(18,5)) from table;

从上面的查询中,我得到的输出与输入相同

99000
999000
499000
350000
344000000

另外,我尝试将输入除以 10^5 并转换为十进制 (18,5)。

select col_a, cast(col_a/100000 as decimal(18,5)) from table;

以上查询返回小数值,但小数点后没有 5 位。

0.99
9.99
4.99
3.5
344000000

有人可以纠正我在这里遗漏或做错了什么。

【问题讨论】:

  • 在最后一个数据集中它应该是 3440 而不是 344000000。

标签: hadoop hive apache-spark-sql


【解决方案1】:

DECIMAL 类型不允许值大于列定义所暗示的范围。

DECIMAL(5,0) 列支持 -99999 到 99999 的范围。

DECIMAL(M,D) 列允许小数点左侧最多为M - D 位。

例如 DECIMAL(5,2) 允许 -999.99 到 999.99

并且不显示尾随零。如果您需要保证显示它们,请使用字符串类型和 rpad() 函数在末尾添加零或类似的东西。

如果数字不能转换为十进制,则返回NULL,例如以下转换返回NULL:

select cast(1234567890L as decimal(3,1))

不清楚你为什么期望cast a bigint to decimal(18,5) 产生一些小数。 cast 不会除以您的初始数字。

【讨论】:

    猜你喜欢
    • 2015-02-28
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 2020-09-27
    • 1970-01-01
    • 2021-02-27
    相关资源
    最近更新 更多