这个问题在这里已经有了答案:
Convert value depending on a type in SparkSQL via case matching of type
(3 个回答)
3年前关闭。
什么是正确的DataType
用于从列为 Decimal
的模式中读取数据- 并且底层 java 类型为 BigDecimal
?
这是该字段的架构条目:
-- realmId: decimal(38,9) (nullable = true)
当我尝试
java.lang.Long
时最终出现以下错误:java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.Long
我注意到有一个
DecimalType
但它扩展 AbstractDataType
而不是 DataType
并且不清楚如何将其指定为返回类型。最佳答案
这是泡菜。其实就是匹配方式DecimalType
这很奇怪。
import org.apache.spark.SparkContext
import org.apache.spark.sql.types._
import org.apache.spark.sql.{Row, SparkSession}
val spark: SparkSession = SparkSession.builder().getOrCreate()
val sc: SparkContext = spark.sparkContext
def rg(r: Row, fname: String, ftype: DataType = StringType) = ftype match {
case StringType => r.getString(r.schema.fieldIndex(fname))
case DecimalType() => r.getDecimal(r.schema.fieldIndex(fname))
case _ => "error"
}
现在让我们测试一下。首先,我们需要创建我们的十进制类型,如下所示:
val decimalType : DecimalType = DataTypes.createDecimalType(15, 10)
val sch = StructType(StructField("x1", StringType, true) :: StructField("x2", decimalType, true) :: Nil)
val row = sc.parallelize(Seq("abc,0.352", "def,0.27", "foo,8.35", "bar,-153.890"))
.map(x => x.split(",")).map(x => Row(x(0), BigDecimal.decimal(x(1).toDouble)))
val df = spark.createDataFrame(row, sch)
// df: org.apache.spark.sql.DataFrame = [x1: string, x2: decimal(15,10)]
现在让我们检查该函数的作用:
println(rg(df.first(), "x2", decimalType))
// 0.3520000000
关于scala - 如何在 spark sql 中读取 BigDecimal 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51647441/