如何在scala中读取38精度和18刻度的十进制数据

lxkprmvk  于 2021-06-01  发布在  Hadoop
关注(0)|答案(1)|浏览(342)

我在rdbms中有decimal(38,16)类型的数据。我正在以Parquet文件格式将这些数据导入hdfs(hadoop)。在那之后,我正在把Parquet地板文件读入spark代码。

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

一旦数据加载到spark dataframe中,该列的数据类型就转换为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

但在这里,我期待的是,因为它是数据,没有四舍五入的价值。
提前谢谢。

dba5bblo

dba5bblo1#

您可以预定义模式以生成高精度列 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")

相关问题