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

标签 scala apache-spark

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





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/

相关文章:

scala - 在 Spark 数据集上使用 groupByKey 中的最小/最大操作

r - 如何将变量传递给spark_apply()中调用的函数?

python - 我如何在工作流模板 Spark 作业中传递参数

java - 在主节点上触发Emr并提交作业(jar):

java - 通过使用助手生成 html

apache-spark - YARN 在 launch_container.sh 中如何执行 PYSPARK 环境设置

groovy - Spark/Gradle -- 在 build.gradle 中获取 IP 地址以用于启动 master 和 worker

javascript - scala.js 与 jscala 有什么区别?

java - 我可以从 Java 访问 Scala 对象的不带括号的 val 吗?

validation - Scala 2.10 中验证和扩展构造函数参数的最佳方法