2016-10-10 6 views
1

각 트랜잭션이 단일 항목의 구매를 나타내는 트랜잭션의 데이터 집합이 있습니다. 따라서 주문에 3 개 항목이 포함 된 경우 각 주문은 3 개의 거래로 기록됩니다.String, Spark 2.0의 데이터 집합 쌍

예 데이터 세트 :

User Order, ItemCount, OrderAmount 
1  1  2   20    
1  2  2   60  
2  3  2   40 
3  4  3   45 

지금 나는 그룹에 원하는 :

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을 집계 한 데이터 집합을 줄이기 위해 사용자별로 주문을하고 각 사용자의 주문에 대한 분석을 수행합니다. Spark에서 사용자별로 주문을 그룹화하고 사용자가 사용자 ID이고 데이터 집합에 주문이 포함 된 한 쌍으로 끝나는 방법이 있습니까?

내가보기에 유일한 해결책은 데이터 세트를 rdd로 변환하고 rddpair를 얻기 위해 groupbykey를 수행 한 다음 행 목록에 대한 분석을 수행하는 코드를 작성하는 것입니다.

데이터 집합으로 주문을 처리하고 데이터 집합 기능을 사용하여 분석 할 수있는 솔루션을 선호합니다. 누구든지 나를 올바른 방향으로 인도 할 수 있습니까? 이것이 가능한가?

저는 Spala에 대한 경험이 매우 부족한 경우 스파크를 처음 사용하고 Java로 Spark를 사용했지만 스칼라의 예는 도움이됩니다.

+0

예상되는 결과는 무엇입니까? – mtoto

+0

예상되는 출력은 각 사용자의 주문 요약 인 단일 행 (또는 데이터가 포함 된 개체)입니다. 각 > 쌍은 UserOrderSummary 객체에 매핑되어야합니다. – krunarsson

+0

설명해주십시오. – mtoto

답변

1

userorder으로 그룹화하고 집계 열 itemcountitemprice만으로 그룹화하십시오. 그런 다음 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"))