gpt4 book ai didi

scala - Spark 案例类 - 十进制类型编码器错误 "Cannot up cast from decimal"

转载 作者:行者123 更新时间:2023-12-04 05:29:57 25 4
gpt4 key购买 nike

我正在从 MySQL/MariaDB 中提取数据,在创建数据集期间,数据类型发生错误

Exception in thread "main" org.apache.spark.sql.AnalysisException: Cannot up cast AMOUNT from decimal(30,6) to decimal(38,18) as it may truncate The type path of the target object is: - field (class: "org.apache.spark.sql.types.Decimal", name: "AMOUNT") - root class: "com.misp.spark.Deal" You can either add an explicit cast to the input data or choose a higher precision type of the field in the target object;



案例类是这样定义的
case class
(
AMOUNT: Decimal
)

任何人都知道如何修复它而不触及数据库?

最佳答案

该错误表示 apache spark 无法自动将 BigDecimal(30,6) 从数据库转换为 Dataset 中想要的 BigDecimal(38,18)(我不知道为什么它需要固定参数 38,18。它甚至更多奇怪的是,spark 不能自动将低精度类型转换为高精度类型)。

报告了一个错误:https://issues.apache.org/jira/browse/SPARK-20162 (也许是你)。无论如何,我找到了通过将列转换为数据帧中的 BigDecimal(38,18) 然后将数据帧转换为数据集来读取数据的好方法。

//first read data to dataframe with any way suitable for you
var df: DataFrame = ???
val dfSchema = df.schema

import org.apache.spark.sql.functions._
import org.apache.spark.sql.types.DecimalType
dfSchema.foreach { field =>
field.dataType match {
case t: DecimalType if t != DecimalType(38, 18) =>
df = df.withColumn(field.name, col(field.name).cast(DecimalType(38,18)))
}
}
df.as[YourCaseClassWithBigDecimal]

它应该解决阅读问题(但我猜不是写作问题)

关于scala - Spark 案例类 - 十进制类型编码器错误 "Cannot up cast from decimal",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40952441/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com