java - 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));
解决方案
两者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
用scale
我们想要的转换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 |
+--------------+--------------------+
推荐阅读
- dart - Dart Aqueduct 使用哪个版本?
- r - 如何在散点图中绘制不同的周末天数?
- php - 如何防止 json_encode 对现有 json 进行编码
- sql-server - SQL 触发器在播放中有效,但在生产中无效
- javascript - 如何在 React 功能组件中限制 onWheel 事件
- python - 气流网络服务器 gettins valueError:Samesite
- c# - DateTime.ParseExact 无法转换为正确的日期
- docusaurus - 使它如此 docusaurus 上传到子目录而不是 web 根目录
- gdb - 缓冲区溢出 - 格式字符串漏洞和利用
- asp.net-core - “'对象引用未设置为对象的实例”当我启动应用程序时