Как упомянул LeoC, collect_list
будет сбрасывать нулевые значения.Кажется, есть обходной путь для этого поведения.Оборачивая каждый скаляр в массив, следуя collect_list
, вы получите [[23], [63], [], [32]]
, тогда когда вы сделаете flatten
, вы получите [23, 63,, 32]
.Эти пропущенные значения в массивах являются нулевыми.
collect_list
и flatten
встроенные функции sql. Я полагаю, они были введены в Spark 2.4 .Я не изучал реализацию, чтобы убедиться, что это ожидаемое поведение, поэтому я не знаю, насколько надежно это решение.
import org.apache.spark.sql.functions._
import org.apache.spark.sql.expressions._
val df = Seq(
(Some(1), Some(1), Some(23)),
(Some(1), Some(2), Some(63)),
(Some(1), Some(3), None),
(Some(1), Some(4), Some(32)),
(Some(2), Some(2), Some(56))
).toDF("colA", "colB", "colC")
val newDf = df.withColumn("colD", flatten(collect_list(array("colC"))
.over(Window.partitionBy("colA").orderBy("colB"))))
+----+----+----+-------------+
|colA|colB|colC| colD|
+----+----+----+-------------+
| 1| 1| 23| [23]|
| 1| 2| 63| [23, 63]|
| 1| 3|null| [23, 63,]|
| 1| 4| 32|[23, 63,, 32]|
| 2| 2| 56| [56]|
+----+----+----+-------------+