如何在不使用 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|
#+-----+-----+
我的要求是从十进制值中删除尾随零,我已经尝试使用正则表达式和 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|
#+-----+-----+