Точность и масштаб искры при неверном отображении кажутся неправильными - PullRequest
0 голосов
/ 28 сентября 2019

При чтении документации Spark DataType 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 ,

  • Почему он равен NULL?
  • Почему именно точностьне реализуется?

1 Ответ

0 голосов
/ 28 сентября 2019

Для приведения десятичной искры внутренняя проверка того, что при условии десятичной схемы (9,8) шире, чем 12,345678901 фактической десятичной схемы (11,9).Если да, это означает, что числа могут быть безопасно преобразованы в предоставленную схему без потери точности или диапазона.Взгляните на org.apache.spark.sql.types.DecimalType.isWiderThan ()

Однако в приведенном выше случае десятичное число (11,9) не может быть преобразовано в десятичное число (9,8), поэтому оновозвращается ноль.

//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|
+-----------------------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...