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
我试图了解为什么它会失败以及如何解决。
答案 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()
选项空值是无
答案 2 :(得分:-2)
您正在尝试将整数值直接映射到DataFrame,这是可能的错误,这就是为什么它会导致强制转换错误,类型转换错误。首先尝试收集输出,然后尝试将其映射到数据框。
首先通过调用并行化作业.collect()来收集变量中的值
看到这样的东西-这将有助于将值映射到您要创建的df列。
val someDF = Seq( (8,“蝙蝠”), (64,“鼠标”), (-27,“马”) ).toDF(“ number”,“ word”)