2016-07-20 4 views
0

Ich weiß - Cassandra unterstützt nicht group by. Aber wie kann man bei einer großen Sammlung von Daten ein ähnliches Ergebnis erzielen? Nehmen wir an, ich habe Tabelle mit 1 mln Reihen von clicks, 1 mln mit shares und Tabelle user_profile. clicks und shares speichern Sie einen Vorgang pro Zeile mit created_at Spalte. Auf einem Armaturenbrett Ergebnisse möchte ich Tag gruppiert zeigen, zum Beispiel:Cassanda - Gruppe durch und in der richtigen Weise verbinden

2016-06-01 - 2016-07-01 

+-------------+--------+------+ 
|user_profile | like |share | 
+-------------+--------+------+ 
| John  | 34  | 12 | 
| Adam  | 12  | 4 | 
| Bruce  | 4  | 2 | 
+-------------+--------+------+ 

Die Frage ist, wie kann ich tun dies in der richtigen Weise:

  1. Tabelle user_likes_shares mit counter nach Datum erstellen
  2. UDF erstellen jede Spalte zu group by und sie in dem Code durch die Zusammenführung verbinden Arrays durch Schlüssel
  3. auswählen von Daten aus Tabellen 3 Gruppe und kommen sie in dem Code durch das Zusammenführen von Arrays Schlüssel
  4. Eine weitere Option

Wenn Sie Code verwenden, um die Ergebnisse zu verbinden, verwenden Sie Apache Spark-SQL, ist der Funke der richtige Weg, in diesem Fall?

+1

Mögliches Duplikat von [Cassandra-Gruppe nach und Filterergebnisse] (http://stackoverflow.com/questions/31683872/cassandra-group-by-and-filter-results) –

+0

Konnten Sie die Schemas für die Tabellen zur Verfügung stellen? Nach was gruppieren Sie sich? (Ich vermute, es ist durch eine URL?) – fromanator

Antwort

1

Unter der Annahme, dass Ihre Dashboardseite alle historischen Ergebnisse zeigen werden, von Tag gruppiert:

1. ‚Gruppe von‘ in einer Tabelle: Der denormalised Ansatz ist die akzeptierte Art und Weise, Dinge zu tun in Cassandra als writes and disk space are cheap. Wenn Sie Ihr Datenmodell (und die Anwendungsschreibvorgänge) strukturieren können, um dies zu unterstützen, ist dies der beste Ansatz.

2. ‚Gruppe von‘ in einem UDA: In diesem blog post stellt der Autor, dass alle Zeilen zurück an den Koordinator, in Einklang gebracht und aggregierte dort gezogen (für CL> 1). Selbst wenn Ihre Tabellen clicks und shares nach Datum partitioniert sind, muss Cassandra trotzdem alle Zeilen für dieses Datum zurück zum Koordinator ziehen, sie im JVM-Heap speichern und dann verarbeiten. Dieser Ansatz hat die Skalierbarkeit reduziert.

3. Zusammenführen in Code: Dies wird ein viel langsamerer Ansatz sein, da Sie viel mehr Daten vom Koordinator auf Ihren Anwendungsserver übertragen müssen.

4. Spark: Dies ist ein guter Ansatz, wenn Sie Ad-hoc-Abfragen durchführen müssen (z. B. Daten analysieren, anstatt eine Webseite zu füllen) und vereinfacht werden können, indem Sie Ihre Spark-Jobs über eine Notebook-Anwendung ausführen (ag Apache Zeppelin). In Ihrem Anwendungsfall haben Sie jedoch die Schwierigkeit, auf den Abschluss dieses Jobs zu warten, die Ausgabe irgendwo zu schreiben und dann auf einer Webseite anzuzeigen.

+0

können Sie teilen, wie in Funken zu tun? Verwenden der normalen Methode groupBy oder sql mit DataFrame? –

+0

Gemäß der [Spark-Cassandra-Treiberdokumentation] (https://github.com/datastax/spark-cassandra-connector/blob/master/doc/3_selection.md#grouping-rows-by-partition-key), _spanBy_/_spanByKey_ sollte gegenüber _groupBy_ bevorzugt werden, um das Mischen zu reduzieren.In Bezug auf die Verwendung von SparkSQL weiß ich nicht, ob die Anweisung "GROUP BY" in _spanBy_ übersetzt würde. – alwyn

Verwandte Themen