在 Spark scala 中处理小数值

问题描述 投票:0回答:2

我的文件中有数据,如下所示:

7373743343333444.
7373743343333432.

该数据应转换为十进制值,并且应位于 8.7 的位置,其中 8 是小数点前的数字,7 是小数点后的数字。 我正在尝试读取数据文件,如下所示:

val readDataFile = Initialize.spark.read.format("com.databricks.spark.csv").option("header", "true").option("delimiter", "|").schema(***SCHEMA*****).load(****DATA FILE PATH******)

我试过这个:

val changed = dataFileWithSchema.withColumn("COLUMN NAME", dataFileWithSchema.col("COLUMN NAME").cast(new DecimalType(38,3)))
println(changed.show(5))

但它只在数字末尾给我零,如下所示:

7373743343333444.0000

但是我想要如上所述格式化的数字,我怎样才能实现这一点?

scala apache-spark hive formatting apache-spark-sql
2个回答
0
投票

regexp_replace
trim
format_number
内置功能的简单组合应该可以满足您的需求

import org.apache.spark.sql.functions._
df.withColumn("column", regexp_replace(format_number(trim(regexp_replace(col("column"), "\\.", "")).cast("long")/100000000, 7), ",", ""))

0
投票

将该列除以

10^8
,这会将小数点移动 8 位。之后转换为
DecimalType
以获得正确的小数位数。由于开头有 16 位数字,这意味着最后一位被删除。

df.withColumn("col", (col("col").cast(DoubleType)/math.pow(10,8)).cast(DecimalType(38,7)))
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.