Spark:不支持的文字类型 class scala.collection.immutable.Nil$ List()
Spark: Unsupported literal type class scala.collection.immutable.Nil$ List()
我搜索了与此问题相关的其他答案,但没有帮助。
我正在尝试向数据框添加一列。此列的数据类型为 Seq[CaseClass]
。一开始我以为可能是spark不支持collection类型的column,但事实并非如此
这是我正在尝试的代码示例 运行。我只想在每一行中添加一个空的 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| []|
+---+---------+
更新
对于 2.1,上面针对该版本的链接答案通过将您的 lit(Array)
转换为 lit()
的 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
中实际添加一些内容,需要稍微不同的功能。
我搜索了与此问题相关的其他答案,但没有帮助。
我正在尝试向数据框添加一列。此列的数据类型为 Seq[CaseClass]
。一开始我以为可能是spark不支持collection类型的column,但事实并非如此
这是我正在尝试的代码示例 运行。我只想在每一行中添加一个空的 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| []|
+---+---------+
更新
对于 2.1,上面针对该版本的链接答案通过将您的 lit(Array)
转换为 lit()
的 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
中实际添加一些内容,需要稍微不同的功能。