cast(“decimal(32,9)”)正在转换为输入值0的科学值0e-9

gopyfrb3  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(1788)

我正在使用一个非常基本的spark代码,以便将输入值“qty”转换为一个输出变量,该变量将被插入到rdbms中,但是对于输入值“0”,spark cast(“decimal(32,9)”)正在将其转换为0e-9。这是我的密码:

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

当数量值为“0”时,输出为“0e-9”。然后我尝试使用“format\u number”解决了这个问题,但随后将qtyut转换为字符串,并为大于999的数字添加“,”。这是密码

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

nzk0hqpo1#

两者 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 列。

编辑-1(基于评论)

转换 decimal 从科学记数法 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         |
+--------------+--------------------+

相关问题