Impala数据类型转换cast(可解决小数后长串数字问题)

时间:2025-04-24 18:10:21

数据类型转换是一个常见的需求,因为有一些函数、或者运算时,对数据类型有严格要求,所以在做运算前,都需要将数据先进行数据类型的转换,此处就需要用到cast,转为string、timestamp、decimal等等

下面的cast函数的一些用法

-- 时间转字符串
select cast(now() as string) 

-- 日期转时间
select cast('2022-01-01' as timestamp) 

这里顺带分享一下之前遇到的小数后长串数字问题和解决方式:

在计算增长率的时候,我们的计算逻辑基本都是:

计算后保留小数点后4位  -  乘以100  -  加上百分符,一开始我用了round四舍五入,如下:

-- 保留4位小数,四舍五入
select concat(cast(round((16-13)/13 ,4)*100 as string),'%') 

-- 输出
23.080000000000002%

但是很明显,你运行了上面那段代码后,他的结果是:23.080000000000002%,这就跟我们的预期违背了;

虽然批量计算时,有一些数据计算是不会有长串小数的问题,但是只要有,就影响到了用户体验感(我是产品),所以后来我改用cast,直接改成decimal类型,就可以解决小数转字符串后出现上传数字的问题了,代码大致如下

-- 先转decimal,再转string,在拼接%
select concat(cast(cast(12.484542184 as decimal(4,2)) as string),"%")

-- 输出
12.48%

其中,decimal的用法是:

decimal(m,n),其中:m表示显示的最大长度;n表示小数后保留的位数;

也是刚巧遇到的现象,愚笨的我一开始也蒙在鼓里,希望跟我一样遇到这种现象的读者,通过我上面的解释,能解决你的疑惑和问题哈

另外,在使用decimal时,建议此处必须保证除数不为0,否则可能出现报错;如果有兴趣了解原因或遇到报错:UDF ERROR: Decimal expression overflowed;欢迎阅读我的另外一篇博客解决:Impala解决cast导致UDF ERROR: Decimal expression overflowed_丿潇湘丶书笛的博客-****博客