Les bibliothèques R et / ou Python modernes rendent-elles SQL obsolète?

14

Je travaille dans un bureau où SQL Server est l'épine dorsale de tout ce que nous faisons, du traitement des données au nettoyage en passant par le munging. Mon collègue est spécialisé dans l'écriture de fonctions complexes et de procédures stockées pour traiter méthodiquement les données entrantes afin qu'elles puissent être standardisées et mises en œuvre dans des rapports, des visualisations et des projets d'analyse. Avant de commencer ici, j'avais très peu d'expérience avec SQL, à part écrire les requêtes les plus élémentaires. La grande majorité de mon travail de préparation à l'analyse a été entièrement effectuée dans R. Mon patron insiste pour que j'améliore mes compétences SQL, même s'il semble y avoir très peu de tâches qui ne peuvent pas être effectuées plus efficacement et avec beaucoup moins de lignes de code en utilisant R des packages comme dplyr, data.table et tidyr (pour n'en nommer que quelques-uns). Ma question est - est-ce que cela a du sens?

Il y a quelques semaines, je me suis retrouvé confronté à la tâche d'obtenir une liste de noms de colonnes pour chaque ligne d'un tableau qui répondait à certains critères et de les concaténer en un vecteur de chaînes. Il y avait un délai serré et à l'époque, je rencontrais un blocage et je ne pouvais pas tout à fait comprendre le problème. J'ai demandé à mon patron, qui à son tour a demandé à mon collègue d'écrire un script TSQL pour résoudre le problème. Pendant qu'il y travaillait, j'ai trouvé un moyen de le faire en écrivant une fonction assez simple et en l'appliquant sur la trame de données. Mon collègue est revenu avec son script environ deux heures plus tard. Il s'agissait d'au moins 75 lignes comprenant deux boucles imbriquées. Je lui ai demandé d'avertir quand la course serait terminée et il a dit que cela prendrait plusieurs heures. Pendant ce temps, mon script R a pu parcourir les 45 000 enregistrements en environ 30 secondes.

Ai-je raison de supposer que R est un bien meilleur choix pour le nettoyage et la fusion des données? Peut-être que le développeur SQL de mon bureau est tout simplement incompétent? Je suis curieux de savoir si quelqu'un qui a travaillé à la fois avec R et SQL (ou Python et SQL d'ailleurs) a des idées à ce sujet.

AffableAmbler
la source
2
Si votre base de données est suffisamment petite et statique, vous pouvez la charger en mémoire et utiliser votre outil ETL préféré, comme dplyr. Votre approche ne fonctionnera tout simplement pas lorsque vous avez des données volumineuses dans le cloud. Je lance régulièrement des requêtes qui font que BigQuery (Google) se plaint. J'écris des requêtes directement en SQL mais je pourrais utiliser Spark comme couche intermédiaire pour opérer dans des dataframes si je le voulais.
Emre
1
SQL est-il donc intrinsèquement plus efficace que R en termes de stockage des données, ou est-ce simplement que les serveurs SQL ont tendance à avoir plus de mémoire intégrée et de puissance de traitement?
AffableAmbler
1
Vous ne pouvez pas faire une déclaration générale - cela dépend de l'implémentation - mais les bonnes bases de données ont des optimiseurs de requête, et certains d'entre eux (comme BigQuery) prennent en charge l'exécution multicœur. Peut-être que vous voulez une abstraction de trame de données ou ORM au-dessus de votre base de données pour éviter SQL. Il semble que dplyr le fasse déjà dans une certaine mesure (cf. traduction SQL ). Vous pouvez comparer la même requête dans dplyr par rapport au SQL brut pour le savoir. Ce que certains font, c'est de prélever un petit échantillon de données pour le prototypage, puis d'éliminer les outils de Big Data pour la production
Emre
3
Vous pouvez simplement exécuter R dans SQL Server et avoir le meilleur des deux mondes
Gaius

Réponses:

13

R et SQL sont deux bêtes complètement différentes. SQL est un langage que vous pouvez utiliser pour interroger des données stockées dans des bases de données comme vous l'avez déjà vécu. Les avantages de SQL par rapport à R résident principalement dans le fait du serveur de base de données (MS SQL, Oracle, PostgreSQL, MySQL, etc.).

La plupart, sinon la totalité, des serveurs de bases de données modernes permettent à plusieurs utilisateurs d'interroger des données à partir de la même source de données et d'insérer, de mettre à jour et de supprimer des données dans les mêmes tables tout en garantissant la cohérence des données. Ceci est essentiel pour, par exemple, enregistrer une transaction bancaire. Pouvez-vous imaginer gérer une banque sur R? C'est là qu'interviennent les serveurs de bases de données. Ils garantissent les propriétés ACID des procédures exécutées sur la base de données. ACID signifie atomicité, simultanéité, isolement et durabilité (voir la description d'ACID sur wikipedia ). R est une plate-forme mono-utilisateur où tout se passe en mémoire. Donc, si votre ordinateur cesse de fonctionner à mi-chemin dans une grande opération, vos données ne seront pas stockées. Vous êtes également la seule personne qui peut accéder aux données. Pour être clair, R n'est pas considéré comme une alternative pour les serveurs de base de données et / ou SQL.

Un autre avantage principal des serveurs de bases de données est qu’une bonne conception de la base de données garantira que vous pourrez interroger votre base de données rapidement en optimisant les requêtes. Pour atteindre cette base de données, les serveurs gardent une trace de la conception d'une table. Voir pour une discussion complète de ce sujet la page wiki . R ne peut pas effectuer d'optimisation de requête. Une mauvaise conception de la base de données peut ralentir l'exécution de vos requêtes. Les serveurs de base de données peuvent également effectuer une optimisation sur des requêtes qui interrogent plusieurs tables si les clés étrangères sont correctement utilisées dans la conception de la base de données.

Le langage SQL a une syntaxe très différente et je partage votre expérience selon laquelle il est plus court d'écrire des étapes de fusion de données en utilisant la table de données ou la syntaxe dplyr. Cependant, parfois vos données sont trop volumineuses pour R ou vous devez stocker les résultats dans la base de données dans le cadre d'un travail par lots périodique, qui nécessitera de coder votre logique en SQL.

D'après mon expérience, il existe des cas d'utilisation particuliers pour SQL et R / Python. SQL est idéal pour stocker des données critiques pour l'entreprise et pour permettre à plusieurs personnes d'accéder, de modifier, d'insérer et de supprimer des données dans un environnement centralisé. Pour tout transfert de données ponctuel, R et Python sont parfaits. Si votre fusion de données doit être exécutée périodiquement, vous devrez porter votre script R / Python sur SQL.

Stéréo
la source
3

Ce ne sont même pas vraiment comparables. SQL est un langage destiné à accéder aux données, R est un langage destiné à travailler avec les données.

SQL n'est pas un outil efficace pour le munging car il est difficile de voir les étapes intermédiaires et lorsqu'il génère des erreurs, il est peu probable qu'il traite de la forme / qualité / structure de vos données.

Mon flux de travail est généralement:

  1. Obtenir des données brutes à partir d'une requête SQL (dans R)
  2. Construire une routine de munging
  3. Si possible, réécrivez la requête SQL pour accomplir le munging que j'ai accompli dans R

Sachez également que tous les consommateurs de données n'utilisent pas R, mais que beaucoup interfèrent toujours avec la plate-forme de leur choix avec des données utilisant SQL.

HEITZ
la source
1
C'est le même processus que je suis (à la grande antipathie de mon superviseur). Je conviens que l'exécution de tâches de munging complexes telles que celle que je décris ci-dessus semble être beaucoup plus efficace dans un langage comme R. (Appréciez l'affirmation). Mais si le seul but de SQL est d'être un disque dur géant pour vos données, pourquoi ne pas simplement avoir un serveur R? Il semble que toutes les fonctions (mappage, configuration de clés pour lier des tables, regroupement et jointure de données) peuvent désormais toutes être effectuées très efficacement dans R. Une table SQL est-elle plus efficace en termes d'utilisation de la mémoire qu'une trame de données R?
AffableAmbler
1
@Noah parce que tout le monde n'utilise pas R.
HEITZ
2

la bibliothèque (dbplyr) a la bonne approche: tout écrire en R (en utilisant le tidyverse) et laisser la bibliothèque juste à temps "compiler" le code R en SQL bas niveau.

Étant donné que tous les mungings ne sont pas traduisibles, une autre approche est celle adoptée par SQL Server: laissez les extraits de code R être invoqués à partir des commandes SQL "select".

Dan Reznik
la source
1

D'après mon expérience, l'approche 1., 2., 3. mentionnée par HEITZ est possible avec une alternative pour 3. où vous réécrivez vos données de R (data.table) dans MySQL.

Les étapes complètes sont donc MySQL-> data.table-> MySQL

Si vous vous assurez que vous utilisez la syntaxe data.table où vous ne copiez pas le DT, il est également compatible avec la RAM.

Niels Krogh
la source
1

En un mot NON . SQL est un moyen puissant, concis et flexible pour décrire et résumer des données structurées semi-structurées et même non structurées - lorsqu'une couche d'interpréteur appropriée est placée au-dessus. Soit dit en passant, sqlest considéré comme un incontournable pour les scientifiques des données.

SQL est un moyen concis et puissant pour effectuer ses opérations principales de:

  • projections ( sélectionnez ..)
  • filtrage ( ..)
  • regroupement / filtrage ( regrouper par et avoir )
  • agrégations de base ( nombre , somme , avg ..)
  • rejoint

La véritable puissance vient de la combinaison des résultats à l'aide de vues intégrées . Quand je dois faire que je vais utiliser l' un sqldf, pandasql, pysparkSql/ sparkSqlou une connexion directe de SGBDR. Écrire la même chose de la manière la plus concise possible avec data.table(beaucoup mieux que data.frame) ou datatable(mieux que pandas) est encore plus maladroit, beaucoup plus maladroit ou presque impossible selon la complexité des requêtes tentées.

Pour le data munging : c'est une autre histoire: certaines opérations s'expriment facilement en sql et d'autres pas tellement. Cependant, lorsque vous incorporez UDFs, il y a une plus grande latitude de ce qui peut être réalisé. Ma tâche actuelle comprend un certain nombre de tâches UDFpour effectuer des opérations telles que les opérations d' intersection client , les agrégations personnalisées et les méthodes de notation personnalisées .

javadba
la source