如何在不使用 PySpark 更改数据类型的情况下 trim 十进制值后的零?

How to trim zeros after decimal value without changing the datatype using PySpark?

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

样本Table:

Col_1 : string

Col_2 : decimal(18,2)

Col_1 Col_2
ABC 2.00
DEF 2.50
XMN 0.00
RST 1.28

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

Col_1 : string

Col_2 : string

Col_1 Col_2
ABC 2
DEF 2.5
XMN
RST 1.28

预期结果:

Col_1 Col_2
ABC 2
DEF 2.5
XMN 0
RST 1.28

decimal(18,2) 类型将始终存储逗号后的 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|
#+-----+-----+