2016-10-10 8 views
1

私は、各トランザクションが単一のアイテムの購入を表すトランザクションのデータセットを持っています。したがって、注文が3つのアイテムを含む場合、各注文は3つのトランザクションとして記録されます。String、Spark 2.0のデータセットペア

例データセット:

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がユーザーIDでデータセットに注文が含まれている>のペアで終了する方法はありますか?

私が目にする唯一の解決策は、データセットをrddに変換し、rddpairを得るためにgroupbykeyを実行してから、行のリストに対して分析を行うコードを書くことです。

私はデータセットとして注文を処理し、データセット機能を使用して分析を行うソリューションを好むでしょう。誰も私を正しい方向に向けることができますか?これは可能ですか?

私はScalaの経験が非常に限られている限り、スパークを使用してSparkをJavaで使用していますが、Scalaの例が役に立ちます。

+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")) 
関連する問題