如何使用 PySpark 在不更改数据类型的情况下修剪小数值后的零?

Ahn*_*nvi 6 trim decimal apache-spark apache-spark-sql pyspark

我的要求是从十进制值中删除尾随零,我尝试过正则表达式并strip()删除它有效的尾随零,但我们使用正则表达式和 strip 作为字符串数据类型,我想在Col_2不改变精度和小数位数的情况下为十进制。有人可以建议替代方案吗?

样本表:

Col_1:字符串

Col_2:十进制(18,2)

列_1 列_2
ABC 2.00
DEF 2.50
厦门 0.00
快速恢复时间 1.28

使用正则表达式的实际结果:

Col_1:字符串

Col_2:字符串

列_1 列_2
ABC 2
DEF 2.5
厦门
快速恢复时间 1.28

预期结果 :

列_1 列_2
ABC 2
DEF 2.5
厦门 0
快速恢复时间 1.28

bla*_*hop 3

decimal(18,2)type 将始终存储逗号后面的这2 位数字。在逗号右侧显示尾随零只是一个格式问题。因此,如果您想Col_2采用十进制并保留精度,则将其存储为decimal(18,2)并在显示数据时按照您想要的格式设置。

您可以使用该format_number功能:

import pyspark.sql.functions as F

df.withColumn("Col_2", F.expr("format_number(Col_2, '0.##')")).show()

#+-----+-----+
#|Col_1|Col_2|
#+-----+-----+
#|  ABC|    2|
#|  DEF|  2.5|
#|  XMN|    0|
#|  RST| 1.28|
#+-----+-----+
Run Code Online (Sandbox Code Playgroud)