首页 > 解决方案 > cast("decimal(32,9)") 正在将输入值 0 转换为科学值 0E-9

问题描述

我正在使用一个非常基本的 spark 代码,以便将输入值“Qty”转换为将插入 RDBMS 的输出变量,但是对于输入值“0”,spark cast("decimal(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));

标签: javadataframeapache-sparkhadoopapache-spark-sql

解决方案


两者00E-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(基于评论)

decimalscale我们想要的转换from 科学记数法 -

 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         |
+--------------+--------------------+

推荐阅读