【发布时间】:2020-11-05 04:49:00
【问题描述】:
这是我的示例代码。我期望小数(16,4)作为 UDF 的返回类型,但它是小数(38,18)。
有没有更好的解决方案?
我不期待答案“cast(price as decimal(16,4))”,因为我的 UDF 中除了强制转换之外还有其他一些业务逻辑。
提前致谢。
import scala.util.Try
import org.apache.spark.sql.functions.udf
import org.apache.spark.sql.types.Decimal
val spark = SparkSession.builder().master("local[*]").appName("Test").getOrCreate()
import spark.implicits._
val stringToDecimal = udf((s:String, precision:Int, scale: Int) => {
Try(Decimal(BigDecimal(s), precision, scale)).toOption
})
spark.udf.register("stringToDecimal", stringToDecimal)
val inDf = Seq(
("1", "864.412"),
("2", "1.600"),
("3", "2,56")).toDF("id", "price")
val outDf = inDf.selectExpr("id", "stringToDecimal(price, 16, 4) as price")
outDf.printSchema()
outDf.show()
------------------output----------------
root
|-- id: string (nullable = true)
|-- price: decimal(38,18) (nullable = true)
+---+--------------------+
| id| price|
+---+--------------------+
| 1|864.4120000000000...|
| 2|1.600000000000000000|
| 3| null|
+---+--------------------+
【问题讨论】:
标签: apache-spark