Spark агрегирует первую запись по категориям ежемесячно - PullRequest
0 голосов
/ 11 октября 2019

Я работаю со Scala для разработки. Мне поставили следующую задачу: Для каждой комбинации год / месяц агрегируйте первую запись в данной категории, используя определенный столбец. Например, если бы у меня была такая таблица:

+-----+-------+------+----------+-------+
| Day | Month | Year | Category | Price |
+-----+-------+------+----------+-------+
|  2  |   1   | 1998 |    A     | 3.25  |
|  7  |   1   | 1998 |    B     | 5.00  |
|  1  |   1   | 1998 |    A     | 7.00  |
|  9  |   1   | 1998 |    A     | 6.00  |
|  10 |   5   | 1998 |    C     | 7.25  |
|  4  |   5   | 1998 |    C     | 3.00  |
|  2  |   4   | 1999 |    A     | 2.00  |
|  1  |   4   | 1999 |    A     | 3.50  |
|  4  |   4   | 1999 |    B     | 3.00  |
|  8  |   4   | 1999 |    B     | 5.00  |
|  12 |   4   | 1999 |    C     | 2.50  |
|  5  |   4   | 1999 |    C     | 3.00  |
+-----+-------+------+----------+-------+

Я хочу взять все записи по месяцам / годам и разбить их на группы, получить самую раннюю запись для каждой категории, получить эту цену,добавьте его ко всем другим самым ранним ценам в этой категории, а затем возьмите среднее значение по категориям.

Поскольку приведенное выше предложение трудно понять, позвольте мне перейти к примеру. Приведенная выше таблица станет 3 таблицами, которые нужно получить по месяцам / годам:

+-----+-------+------+----------+-------+
| Day | Month | Year | Category | Price |
+-----+-------+------+----------+-------+
|  1  |   1   | 1998 |    A     | 7.00  |
|  2  |   1   | 1998 |    A     | 3.25  |
|  7  |   1   | 1998 |    B     | 5.00  |
|  9  |   1   | 1998 |    A     | 6.00  |   
+-----+-------+------+----------+-------+

+-----+-------+------+----------+-------+
| Day | Month | Year | Category | Price |
+-----+-------+------+----------+-------+
|  4  |   5   | 1998 |    C     | 3.00  |
|  10 |   5   | 1998 |    C     | 7.25  |
+-----+-------+------+----------+-------+

+-----+-------+------+----------+-------+
| Day | Month | Year | Category | Price |
+-----+-------+------+----------+-------+
|  1  |   4   | 1999 |    A     | 3.50  |
|  2  |   4   | 1999 |    A     | 2.00  |    
|  4  |   4   | 1999 |    B     | 3.00  |
|  5  |   4   | 1999 |    C     | 3.00  |
|  8  |   4   | 1999 |    B     | 5.00  |
|  12 |   4   | 1999 |    C     | 2.50  |   
+-----+-------+------+----------+-------+

Сортировка по самой ранней дате. Я хочу выбрать самую раннюю запись для каждой категории, добавить их, а затем разделить на общее количество категорий, представленных в этом месяце. Таким образом, в первый месяц самая ранняя для категории A составляет 7 долларов, а самая ранняя для B - 5 долларов. Таким образом, 5 + 7 = 12. Разделите на 2, потому что есть две категории, в результате чего у вас средняя начальная цена составляет $ 6.

Я хочу сделать это со следующими ограничениями:

  1. Категория может появиться или не появиться в данном месяце
  2. Количество категорий в месяце может измениться
  3. В данном месяце не может быть категорий

Как мне это сделать, используя scala spark? Я подумал о нескольких способах сделать это, но я хочу наиболее эффективный.

[РЕДАКТИРОВАТЬ:] Я хочу получить финальный стол, сгруппированный по месяцам / годам, давая среднюю цену в качестве финальной. колонка:

+-----+-------+------+----------+-------+---------+
| Day | Month | Year | Category | Price | Average |
+-----+-------+------+----------+-------+---------+
|  2  |   1   | 1998 |    A     | 3.25  | 6.00    |
|  7  |   1   | 1998 |    B     | 5.00  | 6.00    |
|  1  |   1   | 1998 |    A     | 7.00  | 6.00    |
|  9  |   1   | 1998 |    A     | 6.00  | 6.00    |
|  10 |   5   | 1998 |    C     | 7.25  | 3.00    |
|  4  |   5   | 1998 |    C     | 3.00  | 3.00    |
|  2  |   4   | 1999 |    A     | 2.00  | 3.22    |
|  1  |   4   | 1999 |    A     | 3.50  | 3.22    |
|  4  |   4   | 1999 |    B     | 3.00  | 3.22    |
|  8  |   4   | 1999 |    B     | 5.00  | 3.22    |
|  12 |   4   | 1999 |    C     | 2.50  | 3.22    |
|  5  |   4   | 1999 |    C     | 3.00  | 3.22    |
+-----+-------+------+----------+-------+---------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...