【发布时间】:2017-06-21 05:09:03
【问题描述】:
我有一个类似的架构 -
val schema = StructType( Seq (
StructField( "a", StringType, true),
StructField( "b", StringType, true),
StructField( "c", StringType, true)
))
and making a dataframe like -
import scala.collection.JavaConverters._
val listrow: List[Row] = List(Row("E-001", "P-001", None), Row("E-001", "P-001", "Attending"))
val rdd = sqlContext.sparkContext.parallelize(listrow)
val df = sqlContext.createDataFrame(rdd, scm)
现在,当我执行 df.first() 时,我得到一个错误,其本质是 - java.lang.RuntimeException:编码时出错:java.lang.RuntimeException:scala.None$ 不是字符串模式的有效外部类型
请注意,我只需要以这种方式创建 df。以上只是一个示例,但生产中的代码有点复杂。我认为它曾经在 Spark 1.6 中工作,但在 Spark 2.0.1 中开始失败。这与编码器有关吗?请注意,某些数据将始终为 None 并且 df 需要处理它。有没有办法处理这个或者数据不能没有?
这里的其他人也可以看到这个并且可能知道解决方案是什么吗?
期待中的感谢!
【问题讨论】:
-
您的列需要字符串,但
None不是字符串。将 None 转换为字符串或将列更改为接受Option[String]而不是String并将您的字符串转换为Option[String]s。真的,我想首先修复产生Nones 的代码,这似乎是一个主要的设计缺陷。 -
我同意。但是有什么办法可以用架构来适应这个吗?
-
您希望数据在数据框中是什么样的?您是真的希望不同类型(选项和字符串)位于同一列中,还是希望能够插入两种类型并自动将它们同质化为单一类型?
标签: scala apache-spark spark-dataframe apache-spark-2.0