Spark:不支持的文字类型类scala.collection.immutable.Nil $ List()

问题描述 投票:0回答:1

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

我正在尝试向数据框添加列。此列的数据类型为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()
scala apache-spark dataframe apache-spark-sql case-class
1个回答
3
投票

根据lit()的回答,如果你使用spark 2.2+,那么只需将typedLit()改为this

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()(使用一些魔法scala语法)来实现。在你的情况下,这将工作,因为数组是空的。

lit()

结果相同:

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| []| +---+---------+ 中实际拥有一些东西需要稍微不同的功能。

© www.soinside.com 2019 - 2024. All rights reserved.