Ich haben cassandra Tabelle mit folgenden Struktur:Funken- und cassandra, Bereichsabfrage auf Gruppierungsschlüssel
CREATE TABLE-Tabelle ( Schlüssel int, Zeit Zeitstempel, Maß float, Primärschlüssel (Schlüssel, Zeit) );
Ich brauche einen Funkenjob zu erstellen, die Daten aus früheren Tabelle, innerhalb bestimmter Start- und End-Zeitstempel lesen einige Verarbeitung tun, und bündig Ergebnisse zurück an Cassandra.
Also mein Spark-Cassandra-Connector wird eine Bereichsabfrage auf Clustering Cassandra-Tabellenspalte tun müssen.
Gibt es Performance-Unterschiede, wenn ich tun:
sc.cassandraTable(keyspace,table).
as(caseClassObject).
filter(a => a.time.before(startTime) && a.time.after(endTime).....
so, was ich tue alle Daten in Spark Laden und
Filterung anwenden oder wenn ich dies tun:
sc.cassandraTable(keyspace, table).
where(s"time>$startTime and time<$endTime)......
, die alle Daten in Cassandra filtert und dann eine kleinere Teilmenge nach Spark lädt.
Die Selektivität einer Bereichsabfrage liegt bei etwa 1% Es ist nicht möglich, den Partitionsschlüssel in die Abfrage einzubeziehen.
Welche dieser beiden Lösungen wird bevorzugt?
Ich denke, 1/20 wird übertrieben sein. Hauptsächlich weil die Zeit Clustering-Schlüssel ist, wird Cassandra sowieso einen vollständigen Tabellenscan durchführen. Aber es wird in der Tat sparen, Zeit zwischen dem Verschieben von Daten aus Cassandra zu Funken, die eine Menge Daten sein können. –
Ich würde definitiv erwarten, dass Einsparungen proportional zur Menge der gelesenen Daten sind. 1) Die Anzahl der zu lesenden stables wird wesentlich geringer sein, da bei der Bereichsüberprüfung nicht alle sstables gelesen werden müssen, wenn der Bereichsscan nicht durchgeführt wird. 2) Die Menge der Objekte, die durch die C * Jvm gehen müssen, wird viel weniger sein. Dies ist wiederum eine signifikante Menge weniger Objekte, die zugewiesen und deserialisiert werden müssen. Also weniger Garbage Collection und weniger Objektzuordnung. 3.) Die Menge an Verkehr zwischen C * -Prozessen und Spark Executor-Prozessen wird minimiert. Dies ist kein Nullkopie-System. – RussS
Vielen Dank für Ihre Antwort. Ich habe dieses Verhalten erwartet, wollte aber sicher sein. Meine einzige Sorge war, dass Cassandra einen vollständigen Tabellenscan durchführen muss (weil ich keine Bedingungen für den Partitionsschlüssel angegeben habe), aber auf jeden Fall ist die zweite Lösung viel besser. –