В Spark 1.4 или более поздней версии есть функция array
, которая принимает массив Column
с и возвращает новый Column
. Функция lit
принимает значение Scala и возвращает тип Column
.
import spark.implicits._
val df = Seq(1, 2, 3).toDF("col1")
df.withColumn("new_col", array(lit("def"), lit("cook"), lit("abc"))).show
+----+----------------+
|col1| new_col|
+----+----------------+
| 1|[def, cook, abc]|
| 2|[def, cook, abc]|
| 3|[def, cook, abc]|
+----+----------------+
В Spark 2.2.0 есть функция typedLit
, которая принимает типы Scala и возвращает тип Column
. эта функция может обрабатывать параметризованные типы scala, например: List, Seq и Map.
val newDF = df.withColumn("new_col", typedLit(List("def", "cook", "abc")))
newDF.show()
newDF.printSchema()
+----+----------------+
|col1| new_col|
+----+----------------+
| 1|[def, cook, abc]|
| 2|[def, cook, abc]|
| 3|[def, cook, abc]|
+----+----------------+
root
|-- col1: integer (nullable = false)
|-- new_col: array (nullable = false)
| |-- element: string (containsNull = true)
Это то, что вы хотели сделать? Вы можете добавить when
, чтобы условно добавить разные наборы списков в каждую строку.