Странная ошибка приведения типа в sparkSQL.createDataFrame
Сбой следующего кода:
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)
За этим исключением:
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 возвращается из другой функции, поэтому я не могу создать строку с неупакованным числовым значением с нуля.
Как решить эту проблему?
2 ответа
Целое число не является двойным, и Spark является правильным в жалобе. Typecast вручную:
val toDouble = udf {x: Int => x.toDouble}
df.withColumn("dbl", toDouble(df.col("ints")))
Вы можете преобразовать Ints в Double перед созданием DataFrame:
val newRdd = RDD.map({ case Row(str, i: java.lang.Integer) => Row(str, i.toDouble) })
val df = sqlContext.createDataFrame(newRdd, schema)