You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hive中Decimal类型去尾零插入同表问题求助

解决Hive Decimal字段存值保留尾零的问题

你的问题核心出在表字段的decimal类型定义上:salary是decimal(10,6),这个类型强制要求存储6位小数,不管你插入的数值有没有尾零,Hive都会自动补零到指定的小数位数。你查询时看到的去尾零效果,是因为把decimal转成double后,double类型的显示会自动省略尾零,但插入时又转回了decimal(10,6),所以存储时又被补回了6位。

给你三个可行的解决方向:

  • 修改表结构(最彻底):如果业务允许,直接把salary的精度改成你需要的小数位数,比如要保留4位就改成decimal(10,4)。执行语句:
    ALTER TABLE test_data_type CHANGE COLUMN salary salary DECIMAL(10,4);
    
    之后再插入数据,就会自动截断多余的尾零(注意:如果原数据小数位超过4位,会自动四舍五入,提前确认数据精度需求)。
  • 查询时处理显示(不改动存储):如果不能改表结构,就在查询的时候用字符串处理去掉尾零,适合展示场景。比如:
    SELECT name, regexp_replace(trim(trailing '0' FROM cast(salary as string)), '\\.$', '') 
    FROM test_data_type;
    
    这个语句会把decimal转成字符串,先去掉末尾的所有0,再去掉可能留下的单独小数点,最后返回的是不带尾零的字符串。
  • 插入前处理但存储仍补零(仅临时处理):如果非要在插入时处理,但不改表结构,其实最终存储还是会补零,因为字段类型限制,不过可以试试这个语句:
    INSERT OVERWRITE TABLE test_data_type 
    SELECT name, cast(regexp_replace(trim(trailing '0' FROM cast(salary as string)), '\\.$', '') as decimal(10,6)) 
    FROM test_data_type;
    
    但实际插入后查询还是会显示6位小数,因为decimal(10,6)的存储规则就是这样,所以这个办法意义不大,更推荐前两个。

内容的提问来源于stack exchange,提问作者suprith M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 17:20:30