我搜索了与这个问题相关的其他答案,但没有帮助。
我正在尝试向数据框中添加一列。该列的数据类型为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()
to typedLit()
, 根据this https://stackoverflow.com/a/35420501/2639647 answer.
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)
进入一个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
需要稍微不同的功能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)