Строка, пара наборов данных в Spark 2.0

#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"))