我在文件中有数据,如下所示:
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
但是我想要如上所述格式化的数字,我该如何实现呢?
答案 0 :(得分: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), ",", ""))
答案 1 :(得分:0)
将列除以10^8
,这会将小数点移动8步。之后转换为DecimalType
以获得正确的小数位数。由于有16个数字开头,这意味着最后一个数字被删除。
df.withColumn("col", (col("col").cast(DoubleType)/math.pow(10,8)).cast(DecimalType(38,7)))