火花十进制类型精度损失

Jar*_*red 5 scala apache-spark apache-spark-sql

我正在测试火花十进制类型的货币量度,并在设置刻度和精度时看到一些奇怪的精度结果,如下所示。我想确保在计算过程中不会丢失任何数据,但是下面的示例不能确保这一点。谁能告诉我为什么Spark sql会发生这种情况?当前版本为2.3.0

val sql = """select cast(cast(3 as decimal(38,14)) / cast(9 as decimal(38,14)) as decimal(38,14)) val"""
spark.sql(sql).show
Run Code Online (Sandbox Code Playgroud)

这返回

+----------------+
|             val|
+----------------+
|0.33333300000000|
+----------------+
Run Code Online (Sandbox Code Playgroud)

Jar*_*red 6

这是当前未解决的问题,请参阅SPARK-27089。建议的解决方法是调整以下设置。我验证了 SQL 语句在此设置为 false 的情况下按预期工作。

spark.sql.decimalOperations.allowPrecisionLoss=false
Run Code Online (Sandbox Code Playgroud)