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

У меня есть набор данных транзакций, где каждая транзакция представляет собой покупку одного предмета. Таким образом, каждый заказ записывается как 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 способ сгруппировать заказы по пользователю и закончить парой >, где Пользователь — это идентификатор пользователя, а набор данных содержит заказы?

Единственное решение, которое я вижу на данный момент, — преобразовать набор данных в rdd и выполнить groupbykey, чтобы получить rddpair>, а затем написать некоторый код для анализа списка строк.

Я бы предпочел решение, в котором я могу работать с заказами как с набором данных и выполнять анализ с использованием функций набора данных. Может ли кто-нибудь указать мне правильное направление здесь? Это возможно?

Я новичок в искрах и использую Spark с Java, поскольку у меня очень ограниченный опыт работы со Scala, но примеры в Scala могут помочь.


person Community    schedule 10.10.2016    source источник
comment
каков ваш ожидаемый результат?   -  person mtoto    schedule 10.10.2016
comment
Ожидаемым результатом будет одна строка (или объект, содержащий данные), который представляет собой сводку заказов для каждого пользователя. Каждая пара ‹User,Dataset‹Row›› должна быть сопоставлена ​​с объектом UserOrderSummary.   -  person    schedule 10.10.2016
comment
Пожалуйста, проиллюстрируйте   -  person mtoto    schedule 10.10.2016
comment
Этот объект UserOrderSummary будет содержать что-то вроде средней суммы заказа, среднего количества товаров, общего количества заказов и т. д. На самом деле этот набор данных содержит больше данных о каждом заказе, который будет использоваться в этой сводке, но моя главная проблема заключается в том, чтобы узнать, можно ли сгруппировать заказы по пользователю и закончить набором данных, который я могу затем сделать все эти агрегаты на.   -  person    schedule 10.10.2016
comment
Вы можете использовать функцию группировки sparkSql, если хотите! Если я правильно понимаю ваш вариант использования, это может решить вашу проблему!   -  person Shiv4nsh    schedule 10.10.2016


Ответы (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"))
person Alberto Bonsanto    schedule 10.10.2016