Was macht kolumnare Datenbanken datenwissenschaftlich?

23

Welche Vorteile bieten spaltenweise Datenspeicher, die sich besser für Data Science und Analytics eignen?

Dawny33
quelle

Antworten:

27

Eine spaltenorientierte Datenbank (= spaltenweiser Datenspeicher) speichert die Daten einer Tabelle spaltenweise auf der Festplatte, während eine zeilenorientierte Datenbank die Daten einer Tabelle zeilenweise speichert.

Es gibt zwei Hauptvorteile der Verwendung einer spaltenorientierten Datenbank im Vergleich zu einer zeilenorientierten Datenbank. Der erste Vorteil betrifft die Datenmenge, die gelesen werden muss, wenn nur einige wenige Funktionen bearbeitet werden. Betrachten Sie eine einfache Abfrage:

SELECT correlation(feature2, feature5)
FROM records

Ein traditioneller Executor würde die gesamte Tabelle (dh alle Funktionen) lesen:

Bildbeschreibung hier eingeben

Stattdessen müssen wir mit unserem spaltenbasierten Ansatz nur die Spalten lesen, die interessiert sind an:

Bildbeschreibung hier eingeben

Der zweite Vorteil, der auch für große Datenbanken von großer Bedeutung ist, besteht darin, dass spaltenbasierter Speicher eine bessere Komprimierung ermöglicht, da die Daten in einer bestimmten Spalte tatsächlich homogen sind als in allen Spalten.

Der Hauptnachteil eines spaltenorientierten Ansatzes besteht darin, dass das Manipulieren (Nachschlagen, Aktualisieren oder Löschen) einer gesamten gegebenen Zeile ineffizient ist. Die Situation sollte jedoch selten in Datenbanken für Analysen auftreten („Warehousing“), was bedeutet, dass die meisten Vorgänge schreibgeschützt sind, selten viele Attribute in derselben Tabelle lesen und Schreibvorgänge nur angefügt werden.

Einige RDMS bieten eine spaltenorientierte Speicher-Engine-Option. Zum Beispiel hat PostgreSQL von Haus aus keine Möglichkeit, Tabellen spaltenbasiert zu speichern, aber Greenplum hat eine Closed-Source-Version erstellt (DBMS2, 2009). Interessanterweise steht Greenplum auch hinter der Open-Source-Bibliothek für skalierbare In-Database-Analysen, MADlib (Hellerstein et al., 2012), was kein Zufall ist. In jüngerer Zeit hat CitusDB, ein Startup, das an analytischen Hochgeschwindigkeitsdatenbanken arbeitet, eine eigene Open-Source-Erweiterung für den Spaltenspeicher für PostgreSQL, CSTORE, veröffentlicht (Miller, 2014). Googles System für maschinelles Lernen in großem Maßstab Sibyl verwendet auch ein spaltenorientiertes Datenformat (Chandra et al., 2010). Dieser Trend spiegelt das wachsende Interesse an spaltenorientiertem Speicher für groß angelegte Analysen wider. Stonebraker et al. (2005) diskutieren weiter die Vorteile von spaltenorientiertem DBMS.

Zwei konkrete Anwendungsfälle: Wie werden die meisten Datensätze für maschinelles Lernen im großen Maßstab gespeichert?

(Die meiste Antwort stammt aus Anhang C von: BeatDB: Ein End-to-End-Ansatz zur Enthüllung von Ausprägungen aus massiven Signaldatensätzen. Franck Dernoncourt, SM, Dissertation, MIT Department of EECS )

Franck Dernoncourt
quelle
1
Das ist eine großartige Antwort. Schön erklärt. Vielen Dank.
Dawny33
1
Dies ist eine sehr gut geschriebene Antwort, und die Diagramme sind sehr hilfreich. Die Referenzen werden auch geschätzt.
Shawn Mehan
Betrachten
wir
11

Es hängt davon ab, was Sie tun.

Spaltenspeicher haben zwei Hauptvorteile:

  • ganze Spalten können übersprungen werden
  • Lauflängenkomprimierung funktioniert bei Spalten besser (für bestimmte Datentypen; insbesondere mit wenigen unterschiedlichen Werten)

Sie haben jedoch auch Nachteile:

  • Viele Algorithmen benötigen alle Spalten und zeichnen nur gleichzeitig auf (z. B. k-means) oder müssen sogar eine paarweise Distanzmatrix berechnen
  • Komprimierungstechniken eignen sich nur für Datentypen und -faktoren mit geringer Dichte, nicht jedoch für kontinuierliche Daten mit zwei Werten
  • Anhänge an Spaltenspeicher sind teuer, daher ist es nicht ideal für das Streaming / Ändern von Daten

Columnar Storage ist sehr beliebt für OLAP, auch bekannt als "dumme Analyse" (Michael Stonebraker) und natürlich für die Vorverarbeitung, wenn Sie in der Tat ganze Spalten verwerfen möchten (aber Sie müssten zuerst strukturierte Daten haben - Sie speichern JSONs nicht in Columnar Format). Denn das Säulenlayout ist wirklich gut, um beispielsweise zu zählen, wie viele Äpfel Sie letzte Woche verkauft haben.

Für einen Großteil der Anwendungsfälle in den Bereichen Wissenschaft / Data Science scheinen Array-Datenbanken der richtige Weg zu sein (und natürlich auch unstrukturierte Eingabedaten). ZB SciDB und RasDaMan.

In vielen Fällen (z. B. Deep Learning) sind Matrizen und Arrays die Datentypen, die Sie benötigen, keine Spalten. MapReduce usw. kann natürlich weiterhin bei der Vorverarbeitung hilfreich sein. Möglicherweise sogar Spaltendaten (aber die Array-Datenbank unterstützt normalerweise auch eine spaltenartige Komprimierung).

Anony-Mousse
quelle
3

Ich habe keine spaltenbasierte Datenbank verwendet, aber ich habe ein Open-Source-Format für spaltenbasierte Dateien namens Parquet verwendet, und ich denke, die Vorteile sind wahrscheinlich die gleichen - schnellere Datenverarbeitung, wenn Sie nur eine kleine Teilmenge einer großen Menge abfragen müssen Anzahl der Spalten. Ich hatte eine Abfrage mit ungefähr 50 Terabyte Avro-Dateien (ein zeilenorientiertes Dateiformat) mit 673 Spalten, die in einem Hadoop-Cluster mit 140 Knoten ungefähr anderthalb Stunden dauerte. Bei Parkett dauerte dieselbe Abfrage ungefähr 22 Minuten, da ich nur 5 Spalten benötigte.

Wenn Sie eine kleine Anzahl von Spalten hätten oder einen großen Teil Ihrer Spalten verwenden, würde eine spaltenbasierte Datenbank meines Erachtens keinen großen Unterschied zu einer zeilenorientierten Datenbank machen, da Sie im Grunde immer noch alle Ihre Daten scannen müssten. Ich glaube, dass spaltenbasierte Datenbanken Spalten separat speichern, während zeilenorientierte Datenbanken Zeilen separat speichern. Ihre Anfrage wird schneller, wenn Sie weniger Daten von der Festplatte lesen können.

Dieser Link erklärt weitere Details.

Ryan Zotti
quelle
0

Hinweis: Dies ist meine Frage, und ich bin sehr dankbar für die wunderbaren Antworten, die mir dabei geholfen haben, das Konzept zu verstehen.

Also würde ich das Konzept so erklären, wie ich es verstanden habe:

Im Allgemeinen werden die Daten in den Datenbanken in den folgenden Formaten gespeichert:

Betrachten Sie dieses Datum:

           X1         X2
1   0.7091409 -1.4061361
2  -1.1334614 -0.1973846
3   2.3343391 -0.4385071

In einem relationalen zeilenbasierten Speicher wird dies folgendermaßen gespeichert:

1, 0.7091409, -1.4061361, 2, -1.1334614, -0.1973846, 3, 2.3343391, -0.4385071 

in Form von Reihen.

Im Spaltenspeicher würde dies folgendermaßen gespeichert:

1, 2, 3, 0.7091409 ,-1.1334614, 2.3343391, -1.4061361, -0.1973846, -0.4385071

in Form von Spalten.

Also, was bedeutet das?

Dies bedeutet, dass das Einfügen (und Aktualisieren) und Löschen im zeilenbasierten Spaltenspeicher schnell erfolgt, da nur die letzten oder ersten Werte entfernt werden. In Spaltenspeichern ist dies jedoch nicht der Fall, da der Wert in jedem Blockspeicher entfernt werden muss.

Wenn jedoch Spaltenaggregate und -operationen erforderlich sind, haben die Spaltenspeicher einen Vorteil gegenüber ihren zeilenbasierten Entsprechungen, da sie spaltenweise gespeichert werden. Infolgedessen ist der Zugriff auf einzelne Spalten sehr einfach.

Dawny33
quelle