gpt4 book ai didi

scala - 如何在 spark sql 中读取 BigDecimal 类型

转载 作者:行者123 更新时间:2023-12-04 01:53:55 29 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





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并且不清楚如何将其指定为返回类型。

enter image description here

最佳答案

这是泡菜。其实就是匹配方式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/

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