如何在Spark SQL中实现数字去冗余尾零及0.0转0的格式转换?
Spark SQL 数字去尾零格式转换方案
需求场景
需要将数字转换为无多余尾零的格式,示例如下:
- 9.82000 → 9.82
- 40183.14 → 40183.14
- 03234.00 → 3234(数值类型自动去除前导零,字符串类型需额外处理)
- 0.0 → 0
现有方法的问题
- 使用
Round()函数会保留尾零(如Round(9.82000, 2)返回9.8200) trim(Round(your_column)) + 0可去除大部分尾零,但对0.0转换失效,仍会得到0.0
解决方案
通过正则表达式替换处理字符串形式的数字,可覆盖所有场景:
处理数值类型列
如果你的列是数值类型(如double、decimal),直接转换为字符串后用正则去除尾零和多余小数点:
SELECT regexp_replace( regexp_replace(cast(your_numeric_col AS STRING), '\\.0+$', ''), '(\\.\\d*?)0+$', '$1' ) AS formatted_number FROM your_table;
处理字符串类型数字列
如果列是带前导零的字符串(如'03234.00'),先去除前导零再处理尾零:
SELECT regexp_replace( regexp_replace( regexp_replace(your_string_col, '^0+(?=\\d)', ''), -- 移除前导零 '\\.0+$', '' ), '(\\.\\d*?)0+$', '$1' ) AS formatted_number FROM your_table;
正则逻辑说明
^0+(?=\\d):匹配开头的连续零(仅当后面有数字时),用于去除前导零\\.0+$:匹配末尾的.000...,直接替换为空,将x.00转为x(\\.\\d*?)0+$:匹配小数部分末尾的尾零,保留有效小数位,将x.yyy00转为x.yyy
测试验证
- 输入
9.82000→ 输出9.82 - 输入
40183.14→ 输出40183.14 - 输入
3234.00(数值类型)→ 输出3234 - 输入
'03234.00'(字符串类型)→ 输出3234 - 输入
0.0→ 输出0
内容的提问来源于stack exchange,提问作者Vanaja Jayaraman
相关产品推荐
相关产品推荐

