#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)
Вывод
- Большое число в java0.0249893480998798801773208566601169877685606479644775390625
- Преобразовано 0.0249893480998798801773208566601169877685606479644775390625
- Большое число в scala 0.02498934809987988
- 0.024989348099879880
- [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
, чтобы получить точное значение. 🙂
Просто попробуйте, если хотите 🙂