Я работаю со 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.
Я хочу сделать это со следующими ограничениями:
- Категория может появиться или не появиться в данном месяце
- Количество категорий в месяце может измениться
- В данном месяце не может быть категорий
Как мне это сделать, используя 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 |
+-----+-------+------+----------+-------+---------+