В моей программе Scala я сталкиваюсь с проблемой объединения результатов нескольких уровней GroupBy.
Набор данных, который я использую, довольно большой. В качестве небольшого примера у меня есть кадр данных, который выглядит следующим образом:
val df = (Seq(("f1", "l1", "loy1", null, "s1"),
("f1", "l1", "loy1", "e1", "s1"),
("f2", "l2", "loy2", "e2", "s2"),
("f2", "l2", "loy2", "e3", null),
("f1", "l1", null , "e1", "s3"),
("f1", "l1", null , "e2", "s3"),
("f2", "l2", null , null, "s4")
).toDF("F", "L", "Loy", "Email", "State"))
+---+---+----+-----+-----+
| F| L| Loy|Email|State|
+---+---+----+-----+-----+
| f1| l1|loy1| null| s1|
| f1| l1|loy1| e1| s1|
| f2| l2|loy2| e2| s2|
| f2| l2|loy2| e3| null|
| f1| l1|null| e1| s3|
| f1| l1|null| e2| s3|
| f2| l2|null| null| s4|
+---+---+----+-----+-----+
Для первого уровня groupBy Я использую следующий скрипт, чтобы получить результат, основанный на тех же столбцах (F, L, Loy) :
df.groupBy("F", "L", "Loy").agg(collect_set($"Email").alias("Email"), collect_set($"State").alias("State")).show
Результат примерно такой:
+---+---+----+--------+-----+
| F| L| Loy| Email|State|
+---+---+----+--------+-----+
| f1| l1|null|[e1, e2]| [s3]|
| f2| l2|loy2|[e2, e3]| [s2]|
| f1| l1|loy1| [e1]| [s1]|
| f2| l2|null| []| [s4]|
+---+---+----+--------+-----+
Проблема, с которой я сталкиваюсь, заключается в том, как я могу выполнить второй уровень groupBy , который основан на условии (F, L, Email) и принимает в качестве введите F и L как строку, а столбец Email как массив [String]. Этот groupBy должен возвращать результат следующим образом:
+---+---+------+--------+---------+
| F| L| Loy| Email| State|
+---+---+------+--------+---------+
| f1| l1|[loy1]|[e1, e2]| [s3, s1]|
| f2| l2|[loy2]|[e2, e3]| [s2]|
| f2| l2| null| []| [s4]|
+---+---+------+--------+---------+
Основная цель - максимально сократить количество записей, применяя groupBy на разных уровнях. Я довольно новичок в Scala, и любая помощь будет оценена :)