为什么以下行在spark中失败,我该如何解决?

时间:2019-05-06 11:23:17

标签: scala apache-spark

sc.parallelize((1 to 10).map(i => if(i % 2 == 0) Some(i) else null)).toDF()

此行失败,并显示以下错误:

java.lang.ClassCastException: org.apache.spark.sql.types.IntegerType$ cannot be cast to org.apache.spark.sql.types.StructType
      at org.apache.spark.sql.SQLContext.createDataFrame(SQLContext.scala:414)
      at org.apache.spark.sql.SQLImplicits.rddToDataFrameHolder(SQLImplicits.scala:155)
      ... 50 elided

我试图了解为什么它会失败以及如何解决。

3 个答案:

答案 0 :(得分:2)

scala Int不能为null。因此,要创建一个包含一个具有空值的int列的spark数据框,您有两个选择:

// either use Option[Int], whose "null value" is None and not null
sc.parallelize((1 to 10).map(i => if(i % 2 == 0) Some(i) else None)).toDF()

// or use java Integers
sc.parallelize((1 to 10).map(i => if(i % 2 == 0) new Integer(i) else null)).toDF()

NB1:使用火花隐式函数可以更加紧凑:

import spark.implicits._
(1 to 10).map(i => if(i % 2 == 0) Some(i) else None).toDF()

NB2:对于您的用例,还可以使用range函数:

spark.range(1, 11).select(when('id % 2 ===0, 'id).otherwise(0) as "value")

答案 1 :(得分:0)

sc.parallelize((1 to 10).map(i => if(i % 2 == 0) Some(i) else None)).toDF()

选项空值是

https://www.scala-lang.org/api/current/scala/Option.html

答案 2 :(得分:-2)

您正在尝试将整数值直接映射到DataFrame,这是可能的错误,这就是为什么它会导致强制转换错误,类型转换错误。首先尝试收集输出,然后尝试将其映射到数据框。

首先通过调用并行化作业.collect()来收集变量中的值

看到这样的东西-这将有助于将值映射到您要创建的df列。

val someDF = Seq(   (8,“蝙蝠”),   (64,“鼠标”),   (-27,“马”) ).toDF(“ number”,“ word”)