2016-08-02 16 views
-2

Ich bin ein Anfänger in Scala Spark und ich habe ein Problem.spark: Karte durch eindeutigen Wert reduzieren

Ich habe eine Karte wie diese (mit Millionen von Zeilen):

Map("date_create1" -> "user_id1", "date_create1" -> "user_id2", "date_create1" -> "user_id1", "date_create2" -> "user_id1")

Ich mag würde zählen, wie viele verschiedene Benutzer ich für jedes Datum haben.

So:

Map("date_create1" -> 2, "date_create2" -> 1)

Wie kann ich tun, dass in Scala/Spark. Wenn ich aggregateByKey benutze, kann ich kein distinct haben, nicht wahr?

Vielen Dank für Ihre Hilfe

+2

gleicher Schlüssel kann nicht zwei verschiedene Werte in einer Karte. – Knight71

Antwort

4

Ich nehme an, Sie ein Tupel wie unten haben. Und was Sie brauchen, ist einen eindeutigen Benutzer nach Datum zu bekommen. Man könnte dies leicht tun, indem unterschiedliche und countByKey mit

val data = Array(("date1","user1"),("date1","user1"),("date1","user3"),("date1","user2"),("date2","user1"),("date2","user2"),("date2","user2")) 
val rdd = sc.parallelize(data) 
val distincCount = rdd.distinct.countByKey() 

Ausgang:

distincCount: scala.collection.Map[String,Long] = Map(date2 -> 2, date1 -> 3) 
+0

danke Ritter71. Ich habe das gemacht. es funktioniert, aber es ist langsam während meiner eindeutigen Operation :(Haben Sie eine andere Lösung, zum Beispiel in der Kombination von distinct und countbykey und reduzieren die Shuffle in Spark? :) –

Verwandte Themen