#java #scala #apache-spark #data-science
#java #scala #apache-spark #наука о данных
Вопрос:
У меня есть набор данных транзакций, где каждая транзакция представляет собой покупку одного товара. Таким образом, каждый заказ записывается как 3 транзакции, если заказ содержит 3 элемента.
Пример набора данных:
User Order, ItemCount, ItemPrice
1 1 1 10
1 1 1 10
1 2 1 30
1 2 1 30
2 3 1 20
2 3 1 20
3 4 1 15
3 4 1 15
3 4 1 15
Чтобы уменьшить набор данных, я сгруппировал по порядку и пользователю и объединил ItemCount и ItemPrice, чтобы получить такой набор данных:
User Order, ItemCount, OrderAmount
1 1 2 20
1 2 2 60
2 3 2 40
3 4 3 45
Теперь я хочу сгруппировать заказы по пользователям и провести некоторый анализ заказов для каждого пользователя. Есть ли в Spark способ группировать заказы по пользователям и заканчивать парой> где User — идентификатор пользователя, а набор данных содержит заказы?
Единственное решение, которое я вижу на данный момент, — преобразовать набор данных в rdd и выполнить groupbykey, чтобы получить rddpair>, а затем написать некоторый код для выполнения моего анализа в списке строк.
Я бы предпочел решение, в котором я мог бы работать с заказами как с набором данных и выполнять свой анализ, используя функциональность набора данных. Может ли кто-нибудь указать мне правильное направление здесь? Возможно ли это?
Я новичок в spark и использую Spark с Java, поскольку у меня очень ограниченный опыт работы со Scala, но примеры в Scala помогли бы.
Комментарии:
1. каков ваш ожидаемый результат?
2. Ожидаемым результатом будет одна строка (или объект, содержащий данные), представляющая собой сводку заказов для каждого пользователя. Затем каждая пара <Пользователь, набор данных<Строка>> должна быть сопоставлена с объектом UserOrderSummary .
3. пожалуйста, проиллюстрируйте
4. Этот объект UserOrderSummary будет содержать что-то вроде: средняя сумма заказа, среднее количество товаров, общее количество заказов и многое другое. В действительности этот набор данных содержит больше данных о каждом заказе, который будет использоваться в этом резюме, но моя главная проблема — узнать, можно ли группировать заказы по пользователям и заканчивать набором данных, для которого я затем могу выполнять все эти агрегации.
5. Вы можете использовать функциональность groupby в SparkSQL, если хотите! Если я правильно понимаю ваш вариант использования, это может решить вашу проблему!
Ответ №1:
Просто сгруппируйте по user
и order
и агрегируйте столбцы itemcount
и itemprice
. Затем сгруппируйте user
и запустите все агрегированные данные в соответствующих столбцах.
df.groupBy($"User", $"Order").agg(sum($"ItemCount").as("count"),
sum($"ItemPrice").as("total"))
.groupBy($"User").agg(avg($"total").as("avg_amount"),
avg($"count").as("avg_count"),
count($"count").as("total_purchases"))