首页 > 解决方案 > Spark:不支持的文字类型类 scala.collection.immutable.Nil$ List()

问题描述

我已经搜索了与这个问题相关的其他答案,但他们没有帮助。

我正在尝试向数据框添加一列。此列的数据类型为Seq[CaseClass]. 起初我认为可能是 spark 不支持集合类型列,但事实并非如此。

这是我尝试运行的代码示例。我只想在以后可以附加到的每一行中添加一个空的 Seq[CaseClass]。

case class Employee(name: String)
val emptyEmployees: Seq[Employee] = Seq()
df.withColumn("Employees", lit(emptyEmployees))

但后来我得到这个错误被抛出withColumn

Unsupported literal type class scala.collection.immutable.Nil$ List()
java.lang.RuntimeException: Unsupported literal type classscala.collection.immutable.Nil$ List()

标签: scalaapache-sparkdataframeapache-spark-sqlcase-class

解决方案


如果您使用的是 spark 2.2+,则只需根据答案更改lit()为。typedLit()

case class Employee(name: String)
val emptyEmployees: Seq[Employee] = Seq()
val df = spark.createDataset(Seq("foo")).toDF("foo")
df.withColumn("Employees", typedLit(emptyEmployees)).show()

向我们展示:

+---+---------+
|foo|Employees|
+---+---------+
|foo|       []|
+---+---------+

更新

对于 2.1,上面针对该版本的链接答案通过将您lit(Array)转换为array()of lit()s (使用一些神奇的 scala 语法)来工作。在您的情况下,这将起作用,因为数组是空的。

def asLitArray[T](xs: Seq[T]) = array(xs map lit: _*)

case class Employee(name: String)

val emptyEmployees: Seq[Employee] = Seq()
val df = spark.createDataset(Seq("foo")).toDF("foo")

df.withColumn("Employees", asLitArray(emptyEmployees)).show()

结果相同:

+---+---------+
|foo|Employees|
+---+---------+
|foo|       []|
+---+---------+

要真正拥有一些东西,你Seq需要一个稍微不同的功能。


推荐阅读