强制转换时,Spark十进制精度和小数位数似乎错误

问题描述 投票:0回答:1

[阅读文档,Spark数据类型BigDecimal(精度,小数位数)表示

  • Precision是位数,而
  • Scale是小数点后的位数。

因此,当我将值转换为小数时

scala> val sss = """select cast(1.7142857343 as decimal(9,8))"""
scala> spark.sql(sss).show
+----------------------------------+
|CAST(1.7142857343 AS DECIMAL(9,8))|
+----------------------------------+
|                        1.71428573|  // It has 8 decimal digits
+----------------------------------+

但是当我投射高于10.0的值时,我得到NULL

scala> val sss = """select cast(12.345678901 as decimal(9,8))"""
scala> spark.sql(sss).show
+----------------------------+
|CAST(11.714 AS DECIMAL(9,8))|
+----------------------------+
|                        null|
+----------------------------+

我希望结果将是12.3456789

  • 为什么它为NULL?
  • 为什么不执行Precision?
scala apache-spark
1个回答
0
投票

要在内部强制转换十进制火花,将验证所提供的模式十进制(9,8)宽于12.345678901实际模式十进制(11,9)。如果是,则表示可以安全地将数字强制转换为提供的模式,而不会丢失任何精度或范围。看看org.apache.spark.sql.types.DecimalType.isWiderThan()

但是,在上述情况下,不能将十进制(11,9)强制转换为十进制(9,8),因此它返回null。

//MAX_PRECISION = 38
val sss = """select cast(12.345678901 as decimal(38,7))"""
spark.sql(sss1).show(10)
+-----------------------------------+
|CAST(12.345678901 AS DECIMAL(38,8))|
+-----------------------------------+
|                         12.3456789|
+-----------------------------------+
© www.soinside.com 2019 - 2024. All rights reserved.