cast ("decimal (32,9)") преобразуется в scientifi c значение 0E-9 для входного значения 0 - PullRequest
0 голосов
/ 26 мая 2020

Я использую очень простой c искровый код для преобразования входного значения «Qty» в выходную переменную, которая будет вставлена ​​в СУБД, однако для входного значения «0» искровое приведение («десятичное ( 32,9) ") преобразует его в 0E-9. Вот мой код:

dfFinal = dfInput.withColumn("QtyOut",dfInput.col("Qty").cast("decimal(32,9)");
dfFinal.show();

Когда значение Qty равно «0», вывод выдается как «0E-9». Затем я попытался использовать «format_number», который решает проблему, но затем преобразует QtyOut в строку и добавляет «,» для чисел больше 999. Вот код для этого

dfFinal = dfInput.withColumn("NewQtyOut",format_number(dfInput.col("curr_notl_amt"),9));

1 Ответ

0 голосов
/ 27 мая 2020

Оба 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         |
+--------------+--------------------+
...