Как читать десятичные данные с точностью 38 и шкалой 18 в Scala

У меня есть данные типа Decimal (38,16) в СУБД. Я импортирую эти данные в HDFS (Hadoop) в формате паркетного файла. После этого я читаю этот файл паркета в код Spark.

val df = spark.read.parquet(<path>)

После загрузки данных в фрейм данных Spark тип данных этого столбца преобразуется в double. Это округляет значение столбца cnt до 14 цифр после запятой, в то время как у меня есть 16 цифр после запятой.

Схема:

scala> df.printSchema
root
 |-- id: integer (nullable = true)
 |-- cnt: double (nullable = true)

Чтобы решить эту проблему, я должен взять простой пример.

Например,

val dt = Array(1,88.2115557137985,223.7658213615901501)

Вывод:

scala> dt.foreach(println)
1.0
88.2115557137985
223.76582136159016

Но здесь я ожидаю, так как это данные без округления значения.

Заранее спасибо.


person Vijay_Shinde    schedule 16.05.2018    source источник
comment
Массив примера и предоставленная вами схема не совпадают. Непонятно, что вы спрашиваете. Scala 2.11.8 repl отображает вывод как ввод без округления. Вам все еще нужна помощь с этим?   -  person kfkhalili    schedule 18.06.2019


Ответы (1)


Вы можете заранее определить свою схему, чтобы сделать столбец высокой точности DecimalType при чтении файла Parquet:

import org.apache.spark.sql.types._

val customSchema = StructType(Array(
  StructField("id", IntegerType, true),
  StructField("cnt", DecimalType(38, 16), true)
))

val df = spark.read.schema(customSchema).parquet("/path/to/parquetfile")
person Leo C    schedule 16.05.2018