[阅读文档,Spark数据类型BigDecimal(精度,小数位数)表示
因此,当我将值转换为小数时
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,
要在内部强制转换十进制火花,将验证所提供的模式十进制(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|
+-----------------------------------+