假设我们有一个DataFrame,其中包含两列:group列和value列。我们希望按group列分组,并获取每个组的前3个值,并将这些值写入一个新的列。下面是一个使用Spark Scala的代码示例:
import org.apache.spark.sql.functions._
import org.apache.spark.sql.expressions.Window
// 创建示例数据
val data = Seq(
("A", 1),
("A", 2),
("A", 3),
("A", 4),
("B", 5),
("B", 6),
("B", 7),
("B", 8)
).toDF("group", "value")
// 使用窗口函数按group列分组,并获取每个组的前3个值
val windowSpec = Window.partitionBy("group").orderBy(col("value"))
val result = data.withColumn("top3", collect_list("value").over(windowSpec).slice(0, 3))
result.show()
输出结果为:
+-----+-----+------+
|group|value| top3|
+-----+-----+------+
| A| 1|[1, 2]|
| A| 2|[1, 2]|
| A| 3|[1, 2]|
| A| 4|[1, 2]|
| B| 5|[5, 6]|
| B| 6|[5, 6]|
| B| 7|[5, 6]|
| B| 8|[5, 6]|
+-----+-----+------+
在上述代码中,我们首先导入了需要使用的函数和窗口类。然后,我们创建了一个示例数据DataFrame,并为其指定了两列:group和value。接下来,我们定义了一个窗口规范,通过分区和排序指定了按group列分组,并按value列排序。最后,我们使用collect_list
函数获取每个组的所有值,并使用slice
函数获取前3个值,将结果存储在新的列top3中。最后,我们打印输出结果。