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

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

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

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

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

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

nzk0hqpo1#

两者 0 以及 0E-9 都是一样的,所以我不知道你为什么要把它改成 0.000000000 .
这是一个测试-

  1. val dfInput = spark.range(1).withColumn("Qty", col("id").cast(StringType))
  2. val processDF = dfInput.withColumn("QtyOut",dfInput.col("Qty").cast("decimal(32,9)"))
  3. processDF.show(false)
  4. processDF.printSchema()
  5. processDF.withColumn("NewQtyOut",format_number(processDF.col("QtyOut"),9)).show()
  6. processDF.withColumn("NewQtyOut",format_number(processDF.col("QtyOut"),9)).printSchema()
  7. processDF
  8. .withColumn("isTrue", when(col("QtyOut").equalTo(0), true).otherwise(false))
  9. .show(false)

输出-

  1. +---+---+------+
  2. |id |Qty|QtyOut|
  3. +---+---+------+
  4. |0 |0 |0E-9 |
  5. +---+---+------+
  6. root
  7. |-- id: long (nullable = false)
  8. |-- Qty: string (nullable = false)
  9. |-- QtyOut: decimal(32,9) (nullable = true)
  10. +---+---+------+-----------+
  11. | id|Qty|QtyOut| NewQtyOut|
  12. +---+---+------+-----------+
  13. | 0| 0| 0E-9|0.000000000|
  14. +---+---+------+-----------+
  15. root
  16. |-- id: long (nullable = false)
  17. |-- Qty: string (nullable = false)
  18. |-- QtyOut: decimal(32,9) (nullable = true)
  19. |-- NewQtyOut: string (nullable = true)
  20. +---+---+------+------+
  21. |id |Qty|QtyOut|isTrue|
  22. +---+---+------+------+
  23. |0 |0 |0E-9 |true |
  24. +---+---+------+------+

请注意 isTrue 列。

编辑-1(基于评论)

转换 decimal 从科学记数法 scale 我们想要-

  1. def bigDecimalFormatter(x: Double, y: Int): Double =
  2. BigDecimal(x).setScale(y, BigDecimal.RoundingMode.HALF_UP).toDouble
  3. val decimalFormatter = udf((decimal: Double, scale: Int) => bigDecimalFormatter(decimal, scale))
  4. processDF.select(decimalFormatter(col("QtyOut"), lit(9)),
  5. decimalFormatter(lit(1.1000000453E4), lit(5)))
  6. .show(false)

输出-

  1. +--------------+--------------------+
  2. |UDF(QtyOut, 9)|UDF(11000.000453, 5)|
  3. +--------------+--------------------+
  4. |0.0 |11000.00045 |
  5. +--------------+--------------------+
展开查看全部

相关问题