火花:不支持的字面类型类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()

如果您使用的是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|       []|
+---+---------+

update

对于2.1,该版本上面的链接答案可通过将lit(Array)转换为lit() S的array()(带有一些魔术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中实际具有某些功能将需要稍有不同的功能。

相关内容

  • 没有找到相关文章

最新更新