Метод approx_count_distinct($"name").over(group)
рассчитывает различное name
на группу, следовательно, это не то, что вы хотите, исходя из ожидаемого результата.Использование count("name")
сверх partition("group_id", "name")
даст желаемое количество:
import org.apache.spark.sql.functions._
import org.apache.spark.sql.expressions.Window
val df = Seq(
("G1", 1, "apple"),
("G1", 2, "orange"),
("G1", 3, "apple"),
("G1", 4, "banana"),
("G1", 5, "apple"),
("G2", 6, "orange"),
("G2", 7, "apple"),
("G2", 8, "apple")
).toDF("group_id", "id", "name")
val group = Window.partitionBy("group_id", "name")
df.
withColumn("name_appeared_count", count("name").over(group)).
orderBy("id").
show
// +--------+---+------+-------------------+
// |group_id| id| name|name_appeared_count|
// +--------+---+------+-------------------+
// | G1| 1| apple| 3|
// | G1| 2|orange| 1|
// | G1| 3| apple| 3|
// | G1| 4|banana| 1|
// | G1| 5| apple| 3|
// | G2| 6|orange| 1|
// | G2| 7| apple| 2|
// | G2| 8| apple| 2|
// +--------+---+------+-------------------+