Обработка десятичных значений в искровой скале - PullRequest
0 голосов
/ 31 мая 2018

У меня есть данные в файле, как показано ниже:

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

Но я хочу, чтобы цифры были отформатированы, как описано выше, как мне этого добиться?

Ответы [ 2 ]

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

Разделите столбец на 10^8, это сдвинет десятичную точку на 8 шагов.После этого приведите к DecimalType, чтобы получить правильное количество десятичных знаков.Поскольку для начала существует 16 цифр, это означает, что последняя удалена.

df.withColumn("col", (col("col").cast(DoubleType)/math.pow(10,8)).cast(DecimalType(38,7)))
0 голосов
/ 31 мая 2018

Простая комбинация встроенных функций 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), ",", ""))
...