scala - Spark:不支持的文字类型类 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| []|
+---+---------+
更新
对于 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
需要一个稍微不同的功能。
推荐阅读
- php - 如何从 PHP 中的数组列表中创建嵌套的值组合
- javascript - 在不知道选择的 id 的情况下从 Bootstrap Select 获取值
- python - 将控制台信息捕获到 python 中的文件
- node.js - 如何在不重新启动节点服务器的情况下反映语言环境更改 - i18n?
- c# - 为什么在反序列化期间尝试解析派生类型时会出错?(Newtonsoft.Json)
- javascript - 如何在 Chrome 中为某些字段禁用用户名自动填充?
- scala - 在 Scala 2.13 中发布一个暴露库的 SBT 插件
- python - Python - 字符串转换为列表
- encryption - ISAP 轻量级加密算法
- sql-server - 将表数据类型从 SQL Server 转换为 Oracle 并将动态 SQL 数据插入到表数据类型