Machen moderne R- und / oder Python-Bibliotheken SQL überflüssig?

14

Ich arbeite in einem Büro, in dem SQL Server das Rückgrat von allem ist, was wir tun, von der Datenverarbeitung über die Reinigung bis hin zum Mungieren. Mein Kollege hat sich darauf spezialisiert, komplexe Funktionen und gespeicherte Prozeduren zu schreiben, um eingehende Daten methodisch so zu verarbeiten, dass sie standardisiert und in Berichten, Visualisierungen und Analyseprojekten verwendet werden können. Bevor ich hier angefangen habe, hatte ich nur sehr wenig Erfahrung mit SQL, abgesehen vom Schreiben der grundlegendsten Abfragen. Die überwiegende Mehrheit meiner Vorbereitungsarbeiten für die Analyse wurde in R durchgeführt. Mein Chef besteht darauf, dass ich meine SQL-Kenntnisse verbessere, obwohl es sehr wenige Aufgaben zu geben scheint, die mit R nicht effizienter und mit weit weniger Codezeilen zu erledigen sind Pakete wie dplyr, data.table und tidyr (um nur einige zu nennen). Meine Frage ist - macht das Sinn?

Vor ein paar Wochen stand ich vor der Aufgabe, eine Liste mit Spaltennamen für jede Zeile in einer Tabelle zu erstellen, die bestimmten Kriterien entspricht, und diese zu einem Vektor aus Zeichenfolgen zu verknüpfen. Es gab eine enge Frist und zu der Zeit war ich blockiert und konnte das Problem nicht richtig angehen. Ich fragte meinen Chef, der wiederum meinen Kollegen bat, ein TSQL-Skript zu schreiben, um das Problem zu lösen. Während er daran arbeitete, fand ich eine Möglichkeit, es in R zu tun, indem ich eine ziemlich einfache Funktion schrieb und sie über den Datenrahmen anwandte. Mein Kollege kam ungefähr zwei Stunden später mit seinem Drehbuch zurück. Es waren mindestens 75 Zeilen, bestehend aus zwei verschachtelten for-Schleifen. Ich bat ihn zu benachrichtigen, wenn es fertig war und er sagte, dass es mehrere Stunden dauern würde. In der Zwischenzeit konnte mein R-Skript die ~ 45.000 Datensätze in etwa 30 Sekunden durchlaufen.

Bin ich zu Recht der Ansicht, dass R eine viel bessere Wahl für das Bereinigen und Löschen von Daten ist? Vielleicht ist der SQL-Entwickler in meinem Büro einfach unfähig? Ich bin gespannt, ob jemand, der sowohl mit R als auch mit SQL (oder Python und SQL) gearbeitet hat, irgendwelche Gedanken dazu hat.

AffableAmbler
quelle
2
Wenn Ihre Datenbank klein genug und statisch ist, können Sie sie in den Speicher laden und Ihr bevorzugtes ETL-Tool wie dplyr verwenden. Ihr Ansatz funktioniert einfach nicht, wenn Sie Big Data in der Cloud haben. Ich führe regelmäßig Abfragen durch, bei denen sich BigQuery (Google) beschwert. Ich schreibe Abfragen direkt in SQL, aber ich könnte Spark als Mittelschicht verwenden, um in Datenrahmen zu arbeiten, wenn ich wollte.
Emre
1
Ist SQL in Bezug auf die Art und Weise, in der die Daten gespeichert werden, von Natur aus effizienter als R?
AffableAmbler
1
Sie können keine pauschale Aussage treffen - dies hängt von der Implementierung ab -, aber gute Datenbanken verfügen über Abfrageoptimierer und einige von ihnen (wie BigQuery) unterstützen die Multicore-Ausführung. Möglicherweise möchten Sie einen Datenrahmen oder eine ORM-Abstraktion über Ihrer Datenbank, um SQL zu vermeiden. Dies scheint dplyr schon einigermaßen zu tun (vgl. SQL-Übersetzung ). Sie könnten die gleiche Abfrage in dplyr mit rohem SQL vergleichen, um dies herauszufinden. Was manche tun, ist, eine kleine Stichprobe von Daten für das Prototyping zu nehmen und dann die Big-Data-Tools für die Produktion herauszuholen
Emre
3
Sie können einfach R in SQL Server ausführen und das Beste aus beiden Welten haben
Gaius

Antworten:

13

R und SQL sind zwei völlig verschiedene Tiere. SQL ist eine Sprache, mit der Sie Daten abfragen können, die in Datenbanken gespeichert sind, wie Sie es bereits erlebt haben. Die Vorteile von SQL gegenüber R liegen hauptsächlich in der Tatsache des Datenbankservers (MS SQL, Oracle, PostgreSQL, MySQL usw.).

Die meisten, wenn nicht alle modernen Datenbankserver ermöglichen es mehreren Benutzern, Daten aus derselben Datenquelle abzufragen und Daten in denselben Tabellen einzufügen, zu aktualisieren und zu löschen, wobei sichergestellt wird, dass die Daten konsistent bleiben. Dies ist zum Beispiel für die Aufzeichnung eines Bankgeschäfts unerlässlich. Können Sie sich vorstellen, mit R eine Bank zu betreiben? Hier kommen Datenbankserver ins Spiel. Sie stellen die ACID-Eigenschaften von Prozeduren sicher, die in der Datenbank ausgeführt werden. ACID steht für Atomicity, Concurrency, Isolation und Durability (siehe ACID-Beschreibung auf Wikipedia ). R ist eine Einzelbenutzerplattform, auf der sich alles im Speicher abspielt. Wenn Ihr Computer während eines großen Vorgangs nicht mehr funktioniert, werden Ihre Daten nicht gespeichert. Sie sind auch die einzige Person, die auf die Daten zugreifen kann. Um klar zu sein, wird R nicht als Alternative für Datenbankserver und / oder SQL angesehen.

Ein weiterer Hauptvorteil von Datenbankservern besteht darin, dass durch ein gutes Datenbankdesign sichergestellt wird, dass Sie Ihre Datenbank schnell abfragen können, indem Sie eine Abfrageoptimierung durchführen. Um dies zu erreichen, verfolgen Datenbankserver das Design einer Tabelle. Eine vollständige Beschreibung dieses Themas finden Sie auf der Wiki-Seite . R kann keine Abfrageoptimierung durchführen. Ein schlechtes Datenbankdesign kann zu einer langsamen Ausführung Ihrer Abfragen führen. Datenbankserver können auch Abfragen optimieren, die mehrere Tabellen abfragen, wenn Fremdschlüssel im Datenbankentwurf ordnungsgemäß verwendet werden.

Die SQL-Sprache hat eine ganz andere Syntax und ich teile Ihre Erfahrung, dass es kürzer ist, Daten-Mung-Schritte mithilfe der Datentabelle oder der Dplyr-Syntax zu schreiben. Manchmal sind Ihre Daten jedoch zu groß für R, oder Sie müssen die Ergebnisse als Teil eines periodischen Batch-Jobs in der Datenbank speichern, um Ihre Logik in SQL zu codieren.

Nach meiner Erfahrung gibt es bestimmte Anwendungsfälle für SQL und R / Python. SQL eignet sich hervorragend zum Speichern geschäftskritischer Daten und zum Zugreifen, Ändern, Einfügen und Löschen von Daten durch mehrere Personen in einer zentralisierten Umgebung. Für einmalige Daten sind munging R und Python großartig. Wenn Ihre Datenerfassung regelmäßig ausgeführt werden muss, müssen Sie Ihr R / Python-Skript nach SQL portieren.

Stereo
quelle
3

Diese sind nicht einmal vergleichbar. SQL ist eine Sprache für den Zugriff auf Daten, R ist eine Sprache für die Arbeit mit Daten.

SQL ist kein effektives Tool zum Mungieren, da es schwierig ist, Zwischenschritte zu erkennen, und wenn es Fehler auslöst, ist es unwahrscheinlich, dass es sich um die Form / Qualität / Struktur Ihrer Daten handelt.

Mein Workflow ist normalerweise:

  1. Rohdaten aus SQL-Abfrage abrufen (in R)
  2. Baue eine Mungo-Routine
  3. Wenn möglich, schreiben Sie die SQL-Abfrage neu, um das in R durchgeführte Munging auszuführen

Beachten Sie auch, dass nicht alle Konsumenten von Daten R verwenden, aber viele dennoch ihre bevorzugte Plattform mit Daten verbinden, die SQL verwenden.

HEITZ
quelle
1
Dies ist der gleiche Prozess, dem ich folge (sehr zum Missfallen meines Vorgesetzten). Ich bin damit einverstanden, dass das Ausführen komplexer Mungo-Aufgaben wie der oben beschriebenen in einer Sprache wie R wesentlich effizienter zu sein scheint. (Schätzen Sie die Bestätigung). Wenn der einzige Zweck von SQL darin besteht, eine riesige Festplatte für Ihre Daten zu sein, warum dann nicht einfach einen R-Server? Es scheint, als ob alle Funktionen (Zuordnen, Einrichten von Schlüsseln zum Verknüpfen von Tabellen, Gruppieren und Verknüpfen von Daten) in R jetzt alle sehr effektiv ausgeführt werden können. Ist eine SQL-Tabelle hinsichtlich der Speichernutzung effizienter als ein R-Datenrahmen?
AffableAmbler
1
@Noah, weil nicht alle Leute R.
HEITZ
2

library (dbplyr) hat den richtigen Ansatz: Schreiben Sie alles in R (mit dem Tidyverse) und lassen Sie die Bibliothek just-in-time den R-Code für SQL auf niedriger Ebene "kompilieren".

Da nicht alle Mungos übersetzbar sind, bietet SQL Server einen anderen Ansatz: Lassen Sie R-Code-Snippets über SQL-Befehle "select" aufrufen.

Dan Reznik
quelle
1

Der von HEITZ erwähnte 1., 2., 3. Ansatz kann nach meiner Erfahrung durch eine Alternative zu 3. ergänzt werden, bei der Sie Ihre Daten aus R (data.table) zurück in MySQL schreiben.

Volle Schritte sind also MySQL-> data.table-> MySQL

Wenn Sie sicherstellen, dass Sie die data.table-Syntax verwenden, bei der Sie die DT nicht kopieren, ist sie auch RAM-freundlich.

Niels Krogh
quelle
1

Mit einem Wort NEIN . SQL ist eine leistungsstarke, übersichtliche und flexible Methode, um strukturierte, halbstrukturierte und sogar unstrukturierte Daten zu beschreiben und zusammenzufassen - wenn eine entsprechende Interpreter-Ebene darauf platziert wird. Übrigens sqlgilt es als fast ein Muss für Datenwissenschaftler.

SQL ist eine prägnante und leistungsstarke Methode, um folgende Kernaufgaben auszuführen:

  • Projektionen ( Auswahl ..)
  • Filterung ( wo ..)
  • Gruppieren / Filtern ( gruppieren nach und mit )
  • Grundlegende Aggregationen ( Anzahl , Summe , Durchschnitt )
  • schließt sich an

Die eigentliche Stärke ergibt sich aus der Kombination von Ergebnissen mithilfe von Inline-Ansichten . Wenn ich brauche zu tun , dass ich eine verwenden sqldf, pandasql, pysparkSql/ sparkSqloder eine direkte Verbindung rdbms. Das Schreiben der gleichen in der knappste Art und Weise möglich , mit data.table(viel besser als data.frame) oder datatable(besser als pandas) ist noch mehr klobig, viel mehr klobig oder fast unmöglich , in Abhängigkeit von der Komplexität der Abfragen versucht.

Für das Munging von Daten : Das ist eine andere Geschichte: Einige Operationen lassen sich leicht in SQL ausdrücken, andere weniger. Wenn Sie jedoch UDFs einbeziehen, gibt es einen größeren Spielraum dafür, was erreicht werden kann. Meine aktuelle Aufgabe umfasst eine Reihe von UDFs solche Dinge wie Kunden zu tun Schnittoperationen, benutzerdefinierte Aggregationen und benutzerdefinierte Scoring - Methoden .

Javadba
quelle