Spark:不支持的文字类型类 scala.collection.immutable.Nil$ List()
Posted
技术标签:
【中文标题】Spark:不支持的文字类型类 scala.collection.immutable.Nil$ List()【英文标题】:Spark: Unsupported literal type class scala.collection.immutable.Nil$ List() 【发布时间】:2019-03-11 17:13:55 【问题描述】:我已经搜索了与此问题相关的其他答案,但他们没有提供帮助。
我正在尝试向数据框添加一列。此列的数据类型为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()
【问题讨论】:
【参考方案1】:如果您使用的是 spark 2.2+,那么只需将lit()
更改为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()
的 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
中实际包含某些内容,需要稍微不同的功能。
【讨论】:
不幸的是,我正在使用 spark 2.1.0,而 map() 的用途。我没有足够的声望点来询问评论是什么以上是关于Spark:不支持的文字类型类 scala.collection.immutable.Nil$ List()的主要内容,如果未能解决你的问题,请参考以下文章