Считать разные при объединении других? - PullRequest
2 голосов
/ 29 мая 2019

Вот так выглядит мой набор данных:

+---------+------------+-----------------+
|  name   |request_type| request_group_id|
+---------+------------+-----------------+
|Michael  |     X      |  1020           |
|Michael  |     X      |  1018           |
|Joe      |     Y      |  1018           |
|Sam      |     X      |  1018           |
|Michael  |     Y      |  1021           |
|Sam      |     X      |  1030           |
|Elizabeth|     Y      |  1035           |
+---------+------------+-----------------+

Я хочу рассчитать сумму request_type на человека и считать уникальных request_group_id '*

Результат должен быть следующим:

+---------+--------------------+---------------------+--------------------------------+
|  name   |cnt(request_type(X))| cnt(request_type(Y))| cnt(distinct(request_group_id))|
+---------+--------------------+---------------------+--------------------------------+
|Michael  |          2         |         1           |      3                         |
|Joe      |          0         |         1           |      1                         |
|Sam      |          2         |         0           |      2                         |
|John     |          1         |         0           |      1                         |
|Elizabeth|          0         |         1           |      1                         |
+---------+--------------------+---------------------+--------------------------------+

Что я сделал до сих пор: (помогает получить первые два столбца)

msgDataFrame.select(NAME, REQUEST_TYPE)
            .groupBy(NAME)
            .pivot(REQUEST_TYPE, Lists.newArrayList(X, Y))
            .agg(functions.count(REQUEST_TYPE))
            .show();

Как считать различные request_group_id в этом выборе? Можно ли это сделать внутри?

Я думаю, что это возможно только через объединение двух наборов данных (мой текущий результат + отдельное агрегирование по отдельным request_group_id)

1 Ответ

1 голос
/ 30 мая 2019

Пример с "countDistinct" ("countDistinct" не работает над окном, заменяется на "size", "collect_set"):

val groupIdWindow = Window.partitionBy("name")
df.select($"name", $"request_type",
      size(collect_set("request_group_id").over(groupIdWindow)).alias("countDistinct"))
  .groupBy("name", "countDistinct")
  .pivot($"request_type", Seq("X", "Y"))
  .agg(count("request_type"))
  .show(false)
...