在Spark Scala中进行窗口划分并仅提取每个组的唯一值,可以通过以下步骤实现:
row_number()
, rank()
, dense_rank()
, sum()
, avg()
等。假设我们有一个DataFrame,包含id
, category
, 和 value
三列,我们希望按category
分组,并在每个组内提取唯一的value
。
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions._
object UniqueValuesInWindow {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder()
.appName("Unique Values in Window")
.master("local[*]")
.getOrCreate()
import spark.implicits._
// 创建示例数据
val data = Seq(
(1, "A", 10),
(2, "A", 20),
(3, "A", 10), // 重复值
(4, "B", 30),
(5, "B", 40),
(6, "B", 30) // 重复值
)
val df = data.toDF("id", "category", "value")
// 定义窗口规范
val windowSpec = Window.partitionBy("category").orderBy("value")
// 使用row_number()来标记重复值
val dfWithRowNumber = df.withColumn("row_num", row_number().over(windowSpec))
// 过滤掉重复值,只保留每组的第一行
val uniqueValuesDF = dfWithRowNumber.filter($"row_num" === 1).drop("row_num")
uniqueValuesDF.show()
}
}
Window.partitionBy("category").orderBy("value")
来定义窗口,按category
分组并按value
排序。row_number()
函数为每个窗口内的行添加一个行号。通过上述步骤和代码示例,可以在Spark Scala中有效地进行窗口划分并提取每个组的唯一值。
领取专属 10元无门槛券
手把手带您无忧上云