如何允许 None 值在 Spark 2 的数据框中被接受?
How to allow None value to be accepted in dataframe in Spark 2?
我有一个类似于 -
的模式
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 替换为 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|
+-----+-----+---------+
或者使用前面提到的内容并使用一个案例 class,它使用 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|
+-----+-----+---------+
我有一个类似于 -
的模式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 替换为 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|
+-----+-----+---------+
或者使用前面提到的内容并使用一个案例 class,它使用 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|
+-----+-----+---------+