scala - SparkSQL.createDataFrame 中出现奇怪的类型转换错误

标签 scala apache-spark apache-spark-sql boxing

以下代码失败:

val RDD = sparkContext.parallelize(Seq(
  Row("123", new java.lang.Integer(456))
))
val schema = StructType(
  StructField("str", StringType) ::
  StructField("dbl", DoubleType) :: Nil
)
val df = sqlContext.createDataFrame(RDD, schema)
df.collect().foreach(println)

除了这个异常(exception):

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Double
    at scala.runtime.BoxesRunTime.unboxToDouble(BoxesRunTime.java:119)
    at org.apache.spark.sql.catalyst.expressions.BaseGenericInternalRow$class.getDouble(rows.scala:44)
    at org.apache.spark.sql.catalyst.expressions.GenericInternalRow.getDouble(rows.scala:221)
    ....

请注意,这只是一个测试用例,在实际情况下,类型 java.lang.Integer 是从另一个函数返回的,因此我无法从头开始使用未装箱的数值创建 Row。

如何解决这个问题?

最佳答案

Integer 不是 Double,Spark 的提示是正确的。手动类型转换:

val toDouble = udf {x: Int => x.toDouble}
df.withColumn("dbl", toDouble(df.col("ints")))

关于scala - SparkSQL.createDataFrame 中出现奇怪的类型转换错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35594759/

相关文章:

Scala:isInstanceOf 后跟 asInstanceOf

Scala 隐式转换apply 方法

arrays - 如何使用Scala和Spark从数组中选择非顺序子集元素?

apache-spark - 使用 Apache Spark 时如何处理数据库的背压?

apache-spark - Spark SQL 如何读取 Parquet 分区文件

scala - 函数组合的类型不匹配

apache-spark - Apache Spark 是在节点级还是集群级缓存 RDD?

apache-spark - spark-csv 不会将 DataFrame 保存到文件时是否有解释?

java - Spark 失败,出现 java.lang.OutOfMemoryError : GC overhead limit exceeded?

scala - Spark Streaming Kafka 中的 DStream 过滤和偏移管理