Потеря точности при переходе на Spark для больших десятичных знаков

#scala #apache-spark #apache-spark-sql #bigdecimal

#scala #apache-spark #apache-spark-sql #bigdecimal

Вопрос:

Ниже приведен пример тестового кода и его выходные данные. Я вижу, что java BigDecimal хранит все цифры, где, поскольку scala BigDecimal теряет в точности и выполняет некоторое округление, и то же самое происходит с spark. Есть ли способ установить точность или сказать, что никогда не округлять. Я ни в коем случае не хочу усекать или округлять

 val sc = sparkSession
import java.math.BigDecimal
import sc.implicits._

val bigNum : BigDecimal = new BigDecimal(0.02498934809987987982348902384928349)
val convertedNum: scala.math.BigDecimal = scala.math.BigDecimal(bigNum)
val scalaBigNum: scala.math.BigDecimal = scala.math.BigDecimal(0.02498934809987987982348902384928349)

println("Big num in java"   bigNum)
println("Converted "   convertedNum)
println("Big num in scala "   scalaBigNum)

val ds = List(scalaBigNum).toDS()
println(ds.head)
println(ds.toDF.head)
  

Вывод

  1. Большое число в java0.0249893480998798801773208566601169877685606479644775390625
  2. Преобразовано 0.0249893480998798801773208566601169877685606479644775390625
  3. Большое число в scala 0.02498934809987988
  4. 0.024989348099879880
  5. [0.024989348099879880]

Ответ №1:

На основе spark.apache.org/docs

  • Точность может быть до 38, масштаб также может быть до 38 (меньше или равен точности). Точность и масштаб по умолчанию равны (10, 0).

здесь:https://www.scala-lang.org/api/2.12.5/scala/math/BigDecimal.html

Но если вы хотите простым способом, то как насчет того, чтобы преобразовать его в String перед преобразованием в DF or DS , чтобы получить точное значение. 🙂

Просто попробуйте, если хотите 🙂