Как читать десятичные данные 38 точности и 18 масштаба в Scala - PullRequest
0 голосов
/ 16 мая 2018

У меня есть данные типа 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

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

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

1 Ответ

0 голосов
/ 16 мая 2018

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

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")
...