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

时间:2019-03-11 17:13:55

标签: scala apache-spark dataframe apache-spark-sql case-class

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

我正在尝试向数据框添加一列。该列的数据类型为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 个答案:

答案 0 :(得分:1)

如果您使用的是Spark 2.2+,则根据this的答案,只需将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()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中实际拥有某些东西,将需要稍有不同的功能。