Scala Spark - создание GroupBy с использованием Array [String] для сопоставления записей, если они содержатся в другом элементе записи в виде списка - PullRequest
0 голосов
/ 17 января 2019

В моей программе 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, и любая помощь будет оценена :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...