2016-10-10 1 views
1

Ich habe einen Datensatz von Transaktionen, bei denen jede Transaktionen einen Kauf eines einzelnen Artikels darstellen. Jede Bestellung wird als 3 Transaktionen erfasst, wenn die Bestellung 3 Artikel enthält.String, Datensatz Paar in Spark 2.0

Beispiel-Datensatz:

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 

den Datensatz zu reduzieren, habe ich im Auftrag und Benutzer gruppiert und aggregiert ItemCount und ItemPrice einen Datensatz wie folgt zu erhalten:

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

Jetzt möchte ich zu einer Gruppe der Bestellungen von Benutzern und analysieren Sie die Bestellungen für jeden Benutzer. Gibt es in Spark eine Möglichkeit, die Bestellungen nach Benutzer zu gruppieren und mit einem Paar> zu beenden, wobei Benutzer die Benutzer-ID ist und das Dataset die Bestellungen enthält?

Die einzige Lösung, die ich im Moment sehe, besteht darin, den Datensatz in rdd umzuwandeln und groupbykey zu machen, um rddpair> zu erhalten und dann Code zu schreiben, um meine Analyse in der Zeilenliste durchzuführen.

Ich würde eine Lösung bevorzugen, wo ich mit den Bestellungen als Dataset arbeiten und meine Analyse mit Dataset-Funktionalität tun kann. Kann mir hier jemand in die richtige Richtung zeigen? Ist das möglich?

Ich bin neu zu funken und habe Spark mit Java verwendet, soweit ich sehr begrenzte Erfahrung mit Scala habe, aber Beispiele in Scala würden helfen.

+0

was ist Ihre erwartete Ausgabe? – mtoto

+0

Die erwartete Ausgabe wäre eine einzelne Zeile (oder ein Objekt, das Daten enthält), die eine Auftragszusammenfassung für jeden Benutzer darstellt. Jedes > -Paar sollte dann dem UserOrderSummary-Objekt zugeordnet werden. – krunarsson

+0

bitte illustrieren – mtoto

Antwort

1

Gerade Gruppe von user und order und aggregierte Spalten itemcount und itemprice. Gruppieren Sie dann nach user und führen Sie alle Aggregationen in den entsprechenden Spalten aus.

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