【问题标题】:How to allow None value to be accepted in dataframe in Spark 2?如何允许在 Spark 2 的数据框中接受 None 值?
【发布时间】: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


【解决方案1】:

您可以将 None 替换为 null.asInstanceOf[String]:

val listrow: List[Row] = List(Row("E-001", "P-001", null.asInstanceOf[String]), Row("E-001", "P-001", "Attending"))

scala> df.show
+-----+-----+---------+
|    a|    b|        c|
+-----+-----+---------+
|E-001|P-001|     null|
|E-001|P-001|Attending|
+-----+-----+---------+

或者使用前面提到的并使用使用 Option[String] 作为第三个值的案例类:

case class Foo(a: String, b:String, c:Option[String])

val listFoo: List[Foo] = List(Foo("E-001", "P-001", None), Foo("E-001", "P-001", Some("Attending")))
listFoo.toDF.show
+-----+-----+---------+
|    a|    b|        c|
+-----+-----+---------+
|E-001|P-001|     null|
|E-001|P-001|Attending|
+-----+-----+---------+

【讨论】:

  • 感谢您的回复,但正如我所提到的,如果我的要求可行,我希望对架构做一些事情以适应此类数据更改。
  • 在将数据输入数据框之前修改数据更为可取。如果您真的想在同一列中包含选项和字符串,则可以使用 Any 类型而不是 StringType。
  • DataType 有没有一个叫做 Any 的类型?
  • 如果这在 1.6 中有效,我敢肯定是因为它以某种方式映射到 String 而不是因为列类型是 Any。你能在 1.6 的那个 DataFrame 上做一个 printSchema 并查看它的类型吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-20
相关资源
最近更新 更多