Потеря точности при переходе на Spark для больших десятичных знаков - PullRequest
0 голосов
/ 20 марта 2019

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

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. Большое число в скале 0.02498934809987988
  4. +0,024989348099879880
  5. [0,024989348099879880]

1 Ответ

0 голосов
/ 20 марта 2019

На основе 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, чтобы получить точное значение.:)

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

...