Die Struktur meiner Daten ist wie folgt:
date: <timestamp>
filter_a: <integer> -> range [0, 1000]
filter_b: <integer> -> range [0, 1000]
filter_c: <integer> -> range [0, 86400]
filter_d: <integer> -> range [0, 6]
group: <string>
second_group: <integer>
variable_a: <float>
variable_b: <float>
variable_c: <float>
a couple more no very important
Ich muss die folgenden Abfragen durchführen:
Zuerst:
- Filtern von Daten durch
date
,filter_a
,filter_b
,filter_c
und andere
Zweitens mit den gefilterten Daten:
- Zähle alle Datensätze
- erhalten Durchschnitt von
variable_a
,variable_b
undvariable_c
- bekommen Standardabweichung von
variable_a
,variable_b
undvariable_c
- Holen Sie sich Quartile von
variable_a
,variable_b
undvariable_c
- Gruppendaten nach
group
odersecond_group
und aggregieren (Count, Avg, Std, ..)
Die Zahl der Benutzer des Systems ist etwa 10 oder 15, aber die Anzahl der Elemente ist sehr groß, gerade jetzt ist es 70M aber es wird 500M in ein paar Wochen , und es wird 1000M in etwa ein Jahr.
Die Anzahl der Abfragen ist gering, nicht mehr als 10 Benutzer gleichzeitig. Mein Problem ist, wie diese Abfragen mit dieser riesigen Datenmenge behandelt werden.
Was habe ich bisher versucht?
Ich begann mit
mongodb
, am Anfang war es schnell, aber es wurde langsam, wenn Quartile mit 10M + berechnet wurden. Es hat sich verbessert, als ich Indizes hinzugefügt habe, aber es hat nicht viel geholfen, als ich alle Daten abfragen musste. Ich habe angefangen, Mongodb zu verwenden, weil die Daten sehr dynamisch waren, aber zum Glück wird sich das Datenformat "nicht mehr ändern".Da
filter_a
undfilter_b
wie Knoten gesehen werden konnte, habe ich es versuchtneo4j
. Ich mochte es neo4j sehr, aber mein Diagramm hatte viele Kanten, so dass Abfragen nicht sehr schnell waren.Da sich das Datenformat nicht ändert und es sich nur um eine Sammlung / Tabelle handelt und daher keine Verknüpfungen in SQL erforderlich sind, habe ich postgresql überprüft. Meine Tests mit postgresql waren schneller, aber ich fürchte, es könnte in Zukunft nicht richtig skaliert werden.
Was brauche ich?
- Ist postgresql eine gute Wahl für diesen Fall?
- Gibt es eine andere Art von Datenbank, die ich verwenden könnte? Welches ist das beste für diesen Fall?
- Was könnte ich noch tun, um es zu verbessern?
Bearbeiten
- Täglich werden etwa 1 Million Elemente eingefügt, die sich im Laufe der Zeit nicht ändern sollten.
- Die Schreibgeschwindigkeit ist nicht wichtig
- Die schwierige Anforderung besteht darin, schnell zu lesen / zu aggregieren
Vielen Dank!
Antworten:
Anstatt sich auf eine relationale Datenbank zu stützen, um diese statistischen Berechnungen für Zeitreihendaten durchzuführen, würde ich vorschlagen, dass Sie diese mathematischen und Nachbearbeitungsarbeiten außerhalb der Datenbank in eine Clientanwendung verschieben.
Mit einer Skriptsprache wie Python oder Ruby können Sie das Problem schrittweise lösen, indem Sie über einen Zeitraum mit fester Breite nach "Datenblöcken" abfragen, eine statistische Zwischenzusammenfassung berechnen und die Ergebnisse während der Schleife über mehrere Blöcke hinweg kombinieren über die ganze Geschichte. Einige statistische Kennzahlen lassen sich nur schwer über mehrere Blöcke hinweg kombinieren, aber so etwas wie Avg () benötigt nur sum () und count () pro Block, O (1) vs. O (Blockgröße), sodass das Zusammenführen von Blöcken gut skaliert werden kann.
quelle
chunksize
helfen. +1Da sich Ihre Daten nicht ändern und nur angehängt werden, würde ich die Daten speichern, wo immer Sie möchten. Amazon S3 zum Beispiel, aber jede schnell lesende Datenbank ist in Ordnung. Keine Indizes. Die von Ihnen ausgewählte Datenbank / FS sollte die Option haben, die Daten in Buckets zu lesen: Sie könnten beispielsweise eine Datei pro Tag mit Ihren 1M-Datensätzen haben.
Dann würde ich Spark verwenden, um die Filterung / Analyse durchzuführen. Es ist clusterbasiert und kann auf Ihre Bedürfnisse skaliert werden.
quelle
Die Reaktion hängt davon ab, wie Sie die Daten danach verwenden. Wenn für die Verarbeitung besser Cassandra verwenden, wenn für die Analyse besser Hive verwenden.
quelle
real time
. Liege ich falsch?Diese Art von Situation ist ideal für Data Warehousing mit den von Ralph Kimball und Co. perfektionierten Techniken auf Plattformen wie SQL Server (die mir am besten vertraute). Sie wurden speziell für diese Art von Szenario entwickelt: riesige Mengen von Datensätzen mit relativ statischen Daten, für die Sie Aggregate dieser Art berechnen müssen. NeinDie relationale Technik passt zu ordnungsgemäß implementiertem Data Warehousing in Anwendungen dieser Art, obwohl einige sicherlich besser sind als andere, wenn sich Ihr Unternehmen die Lizenzen für die Softwarepakete (wie SQL Server Analysis Services), die sie implementieren, einfach nicht leisten kann. Es gibt auch eine Lernkurve für die Implementierung von Sprachen wie MDX, die auf diese Art des Datenzugriffs zugeschnitten sind. Wenn Data Warehousing eine praktikable Option für Ihr Unternehmen ist, verschwenden Sie keine Zeit mit der Suche nach einer relationalen Lösung. Dies ist kein relationales Datenbankproblem. Ich kann bei Bedarf einige grundlegende Verweise auf Kimball usw. und Links zu SSAS und MDX (leider kann ich nicht mit Oracle und anderen Konkurrenten, mit denen ich nicht vertraut bin) veröffentlichen. Ich hoffe das hilft.
quelle