spark
groupBy 후 group 당 N 개의 record 만 남기기
wefree
2025. 1. 6. 21:19
groupBy 후 group 당 최대 N=300 개만 남긴다고 할 때
방법1
groupByKey + mapGroups 사용
val urlLineDs: Dataset[(String, Seq[String])] = spark.read.text(path)
.toDF("url", "item")
.groupByKey(row => row.getAs[String]("url"))
.mapGroups { case (url, rowIter: Iterator[Row]) =>
val itemList: Seq[String] = rowIter.take(300).map(_.getAs[String]("item")).toList
(url, itemList)
}
방법2
window function 사용
val window = Window.partitionBy("url").orderBy(col("item"))
spark.read.text(path)
.toDF("url", "item")
.withColumn("_row_number", row_number().over(window))
.where(col("_row_number") <= 300)
.groupBy("url")
.agg(collect_list("item").as("itemList"))