Оба 0
и 0E-9
одинаковы, поэтому я не знаю, почему вы пытаетесь преобразовать его в 0.000000000
.
Вот тест этого -
val dfInput = spark.range(1).withColumn("Qty", col("id").cast(StringType))
val processDF = dfInput.withColumn("QtyOut",dfInput.col("Qty").cast("decimal(32,9)"))
processDF.show(false)
processDF.printSchema()
processDF.withColumn("NewQtyOut",format_number(processDF.col("QtyOut"),9)).show()
processDF.withColumn("NewQtyOut",format_number(processDF.col("QtyOut"),9)).printSchema()
processDF
.withColumn("isTrue", when(col("QtyOut").equalTo(0), true).otherwise(false))
.show(false)
Вывод -
+---+---+------+
|id |Qty|QtyOut|
+---+---+------+
|0 |0 |0E-9 |
+---+---+------+
root
|-- id: long (nullable = false)
|-- Qty: string (nullable = false)
|-- QtyOut: decimal(32,9) (nullable = true)
+---+---+------+-----------+
| id|Qty|QtyOut| NewQtyOut|
+---+---+------+-----------+
| 0| 0| 0E-9|0.000000000|
+---+---+------+-----------+
root
|-- id: long (nullable = false)
|-- Qty: string (nullable = false)
|-- QtyOut: decimal(32,9) (nullable = true)
|-- NewQtyOut: string (nullable = true)
+---+---+------+------+
|id |Qty|QtyOut|isTrue|
+---+---+------+------+
|0 |0 |0E-9 |true |
+---+---+------+------+
Обратите внимание на столбец isTrue
.
Edit-1 (на основе комментариев)
Преобразуйте decimal
из scientifi c обозначение с scale
мы хотим-
def bigDecimalFormatter(x: Double, y: Int): Double =
BigDecimal(x).setScale(y, BigDecimal.RoundingMode.HALF_UP).toDouble
val decimalFormatter = udf((decimal: Double, scale: Int) => bigDecimalFormatter(decimal, scale))
processDF.select(decimalFormatter(col("QtyOut"), lit(9)),
decimalFormatter(lit(1.1000000453E4), lit(5)))
.show(false)
Выход-
+--------------+--------------------+
|UDF(QtyOut, 9)|UDF(11000.000453, 5)|
+--------------+--------------------+
|0.0 |11000.00045 |
+--------------+--------------------+