scala - 如何允许在 Spark 2 的数据框中接受无值?

标签 scala apache-spark apache-spark-sql apache-spark-2.0

我有一个类似于 -

的模式
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 替换为 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|
+-----+-----+---------+

关于scala - 如何允许在 Spark 2 的数据框中接受无值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42030850/

相关文章:

linux - 如何在 Spark 中编写一个独立应用程序,以在充满提取推文的文本文件中查找 20 个最常提及的内容

scala - 了解 UID 在 Spark MLLib Transformer 中的作用

java - Hbase 不适用于 spark-submit

scala - 为什么 Spark 重新分区会导致 MemoryOverhead?

apache-spark - [Pyspark SQL : Multi-column sessionization

python - 调试 SIGSEGV Java 运行时 fatal error (Python 上的 PySpark)

java - 如何使用 Intellij Idea 远程调试 .jar 文件

scala - scala : mystified by warning 中的模式匹配零参数函数

java - 如何在 ElasticSearch 中获取模拟 TransportClient

scala - 使用 dataframe : Collect return empty array 进行 Spark 单元测试