Spark: неподдерживаемый класс литерального типа scala.collection.immutable.Nil $ List () - PullRequest
0 голосов
/ 11 марта 2019

Я искал другие ответы, связанные с этим вопросом, но они не помогли.

Я пытаюсь добавить столбец в фрейм данных.Этот столбец будет иметь тип данных Seq[CaseClass].Сначала я подумал, что, возможно, спарк не поддерживает столбцы типа коллекции, но это не так.

Вот пример кода, который я пытаюсь запустить.Я просто хочу добавить пустой 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 Ответ

2 голосов
/ 11 марта 2019

Если вы используете искру 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() из 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, потребуется немногодругая функция.

...