Notes du scientifique des donnĂ©es: un aperçu personnel des langages de requĂȘte de donnĂ©es



Je raconte par expĂ©rience personnelle ce qui a Ă©tĂ© utile oĂč et quand. Sondage et thĂšse, pour qu'il soit clair quoi et oĂč creuser plus loin - mais ici j'ai une expĂ©rience personnelle exclusivement subjective, peut-ĂȘtre que tout est complĂštement diffĂ©rent avec vous.



Pourquoi est-il important de connaĂźtre et de pouvoir gĂ©rer les langages de requĂȘte? À la base, dans la science des donnĂ©es, il y a plusieurs Ă©tapes de travail les plus importantes et la toute premiĂšre et la plus importante (sans elle, rien ne fonctionnera, bien sĂ»r!) Est l'acquisition ou la rĂ©cupĂ©ration de donnĂ©es. Le plus souvent, les donnĂ©es sous une forme ou une autre se trouvent quelque part et vous devez les «rĂ©cupĂ©rer» Ă  partir de lĂ . 



Les langages de requĂȘte vous permettent simplement d'extraire ces mĂȘmes donnĂ©es! Et aujourd'hui, je vais vous parler de ces langages de requĂȘte qui m'ont Ă©tĂ© utiles et je vais vous dire oĂč et comment exactement - pourquoi il est nĂ©cessaire d'Ă©tudier.



Au total, il y aura trois principaux blocs de types de requĂȘtes aux donnĂ©es, que nous analyserons dans cet article:



  • Les langages de requĂȘte "standard" sont ce qu'ils comprennent gĂ©nĂ©ralement lorsqu'ils parlent d'un langage de requĂȘte tel que l'algĂšbre relationnelle ou SQL.
  • Langages de requĂȘte de script: par exemple, les astuces pandas de Python, numpy ou les scripts shell.
  • Langages de requĂȘte pour les graphiques de connaissances et les bases de donnĂ©es de graphiques.


Tout ce qui est Ă©crit ici n'est qu'une expĂ©rience personnelle, ce qui s'est avĂ©rĂ© utile, avec une description des situations et "pourquoi c'Ă©tait nĂ©cessaire" - tout le monde peut essayer comment des situations similaires peuvent vous rencontrer et essayer de s'y prĂ©parer Ă  l'avance, aprĂšs avoir traitĂ© ces langues avant de devoir pour postuler (de toute urgence) sur un projet ou mĂȘme pour obtenir un projet lĂ  oĂč ils sont nĂ©cessaires.



Langages de requĂȘte "standard"



Les langages de requĂȘte standard sont prĂ©cisĂ©ment dans le sens oĂč nous pensons gĂ©nĂ©ralement Ă  eux lorsque nous parlons de requĂȘtes.



AlgĂšbre relationnelle



Pourquoi l'algĂšbre relationnelle est-elle nĂ©cessaire aujourd'hui? Afin d'avoir une bonne idĂ©e de la raison pour laquelle les langages de requĂȘte sont organisĂ©s d'une certaine maniĂšre et de les utiliser dĂ©libĂ©rĂ©ment, vous devez comprendre le noyau sous-jacent.



Qu'est-ce que l'algĂšbre relationnelle?



La définition formelle est la suivante: l'algÚbre relationnelle est un systÚme fermé d'opérations sur les relations dans un modÚle de données relationnel. Plus humainement, il s'agit d'un systÚme d'opérations sur les tables, de sorte que le résultat est aussi toujours une table.



Voir toutes les opĂ©rations relationnelles dans cet article de Habr - nous dĂ©crivons ici pourquoi vous devez savoir et oĂč cela est utile.



Pourquoi?



Vous commencez Ă  comprendre pour quoi les langages de requĂȘte sont gĂ©nĂ©ralement utilisĂ©s et quelles opĂ©rations se cachent derriĂšre les expressions de langages de requĂȘte spĂ©cifiques - donne souvent une comprĂ©hension plus approfondie de ce qui et comment fonctionne dans les langages de requĂȘte.





Tiré de cet article. Exemple d'opération: join, qui joint des tables.



Matériel d'étude:



Un bon cours d'introduction de Stanford . En général, il existe de nombreux matériaux sur l'algÚbre relationnelle et la théorie - Coursera, Udacity. Il existe également une énorme quantité de documents en ligne, y compris de bons cours académiques . Mon conseil personnel est de bien comprendre l'algÚbre relationnelle - c'est le fondement.



SQL





Tiré de cet article.



SQL est, en fait, une implĂ©mentation de l'algĂšbre relationnelle - avec une mise en garde importante, SQL est dĂ©claratif! Autrement dit, en Ă©crivant une requĂȘte dans le langage de l'algĂšbre relationnelle, vous dites en fait comment compter - mais avec SQL, vous spĂ©cifiez ce que vous voulez extraire, puis le SGBD gĂ©nĂšre dĂ©jĂ  des expressions (efficaces) dans le langage de l'algĂšbre relationnelle (leur Ă©quivalence nous est connue sous le thĂ©orĂšme de Codd ) ...





Tiré de cet article.



Pourquoi?



Les SGBD relationnels: Oracle, Postgres, SQL Server, etc. sont toujours pratiquement partout et il y a de fortes chances que vous ayez Ă  interagir avec eux, ce qui signifie que vous devrez soit lire SQL (ce qui est trĂšs probable) soit y Ă©crire ( Ă©galement pas improbable).



Que lire et apprendre



À partir des mĂȘmes liens ci-dessus (sur l'algĂšbre relationnelle), il existe une quantitĂ© incroyable de matĂ©riel, comme celui-ci .



Au fait, qu'est-ce que NoSQL?



"Il convient de souligner une fois de plus que le terme" NoSQL "a une origine complÚtement spontanée et n'a pas de définition généralement acceptée ou d'institution scientifique derriÚre lui." L' article correspondant sur Habré.



En fait, les gens ont rĂ©alisĂ© qu'un modĂšle relationnel complet n'est pas nĂ©cessaire pour rĂ©soudre de nombreux problĂšmes, en particulier pour ceux oĂč, par exemple, les performances sont fondamentales et certaines requĂȘtes simples avec agrĂ©gation dominent - il est essentiel de lire rapidement les mĂ©triques et de les Ă©crire dans la base de donnĂ©es, et la plupart des fonctionnalitĂ©s sont relationnelles. s'est avĂ©rĂ© non seulement inutile, mais aussi nuisible - pourquoi normaliser quelque chose si cela gĂąche la chose la plus importante pour nous (pour une tĂąche spĂ©cifique) - les performances?



De plus, il fallait souvent des schémas flexibles au lieu des schémas mathématiques fixes du modÚle relationnel classique - et cela simplifie incroyablement le développement d'applications, lorsqu'il est essentiel de déployer le systÚme et de commencer à travailler rapidement, en traitant les résultats - ou le schéma et les types de données stockées ne sont pas si importants.



Par exemple, nous crĂ©ons un systĂšme expert et nous voulons stocker des informations sur un certain domaine avec des mĂ©ta-informations - nous ne connaissons peut-ĂȘtre pas tous les champs et il est ridicule de stocker JSON pour chaque enregistrement - cela nous donne un environnement trĂšs flexible pour Ă©tendre le modĂšle de donnĂ©es et une itĂ©ration rapide - donc, dans un tel le cas de NoSQL serait mĂȘme prĂ©fĂ©rable et lisible. Un exemple d'entrĂ©e (d'un de mes projets, oĂč NoSQL Ă©tait exactement lĂ  oĂč il Ă©tait nĂ©cessaire).



{"en_wikipedia_url":"https://en.wikipedia.org/wiki/Johnny_Cash",
"ru_wikipedia_url":"https://ru.wikipedia.org/wiki/?curid=301643",
"ru_wiki_pagecount":149616,
"entity":[42775," ","ru"],
"en_wiki_pagecount":2338861}




Vous pouvez en savoir plus sur NoSQL ici .



Quoi Ă©tudier?



Au contraire, vous devez juste ĂȘtre bon dans l'analyse de votre tĂąche, de ses propriĂ©tĂ©s et des systĂšmes NoSQL disponibles qui correspondent Ă  cette description - et dĂ©jĂ  Ă©tudier ce systĂšme.



Langages de requĂȘte de script



Au dĂ©but, il semble que Python a Ă  voir avec cela - c'est un langage de programmation, et pas du tout des requĂȘtes.







  • Pandas est un couteau suisse direct de la Data Science, une Ă©norme quantitĂ© de transformation de donnĂ©es, d'agrĂ©gation, etc. y a lieu.
  • Numpy est le calcul vectoriel, les matrices et l'algĂšbre linĂ©aire.
  • Scipy contient beaucoup de mathĂ©matiques dans ce package, en particulier les statistiques.
  • Jupyter lab - de nombreuses analyses de donnĂ©es exploratoires s'intĂšgrent bien dans les ordinateurs portables - c'est bien de pouvoir le faire.
  • Demandes - rĂ©seautage.
  • Les Pysparks sont trĂšs populaires auprĂšs des ingĂ©nieurs de donnĂ©es, vous devrez probablement interagir avec ce ou et spark, simplement en raison de leur popularitĂ©.
  • * Le sĂ©lĂ©nium est trĂšs utile pour collecter des donnĂ©es Ă  partir de sites et de ressources, parfois il n'y a tout simplement pas d'autre moyen d'obtenir les donnĂ©es.


Mon meilleur conseil: apprenez Python!

Pandas



Prenons le code suivant comme exemple:



import pandas as pd
df = pd.read_csv(“data/dataset.csv”)
# Calculate and rename aggregations
all_together = (df[df[‘trip_type’] == “return”]
    .groupby(['start_station_name','end_station_name'])\
                  	    .agg({'trip_duration_seconds': [np.size, np.mean, np.min, np.max]})\
                           .rename(columns={'size': 'num_trips', 
           'mean': 'avg_duration_seconds',    
           'amin': min_duration_seconds', 
           ‘amax': 'max_duration_seconds'}))


En fait, nous pouvons voir que le code s'inscrit dans le modĂšle SQL classique.



SELECT start_station_name, end_station_name, count(trip_duration_seconds) as size, 
..
FROM dataset
WHERE trip_type = ‘return’
GROUPBY start_station_name, end_station_name


Mais la partie importante est que ce code fait partie du script et du pipeline, en fait, nous intĂ©grons des requĂȘtes dans le pipeline Python. Dans cette situation, le langage de requĂȘte nous vient de bibliothĂšques telles que Pandas ou pySpark.



En gĂ©nĂ©ral, dans pySpark, nous voyons un type similaire de transformation de donnĂ©es via le langage de requĂȘte dans l'esprit de:



df.filter(df.trip_type = “return”)\
  .groupby(“day”)\
  .agg({duration: 'mean'})\
  .sort()


OĂč et quoi lire



Ce n'est pas un problĂšme de trouver des matĂ©riaux Ă  Ă©tudier sur python lui-mĂȘme . Il existe un grand nombre de tutoriels sur les pandas , pySpark et les cours sur Spark (ainsi que sur DS lui-mĂȘme ) sur le net . En gĂ©nĂ©ral, les matĂ©riaux ici sont excellents sur Google et si je devais choisir un package sur lequel me concentrer, ce serait des pandas, bien sĂ»r. Il y a aussi beaucoup de matĂ©riaux sur le bundle DS + Python .



Shell comme langage de requĂȘte



Beaucoup de projets de traitement et d'analyse de donnĂ©es avec lesquels j'ai dĂ» travailler sont en fait des scripts shell qui appellent du code en Python, en java et les commandes shell elles-mĂȘmes. Par consĂ©quent, en gĂ©nĂ©ral, vous pouvez considĂ©rer les pipelines dans bash / zsh / etc, comme une requĂȘte de haut niveau (vous pouvez, bien sĂ»r, pousser des boucles lĂ -bas, mais ce n'est pas typique pour le code DS dans les langages shell), nous donnerons un exemple simple - j'avais besoin de mapper le Wikidata QID et un lien complet vers le wiki russe et anglais, pour cela j'ai Ă©crit une requĂȘte simple Ă  partir des commandes dans le bash et pour la sortie j'ai Ă©crit un script simple en Python, que j'ai assemblĂ© comme ceci:



pv “data/latest-all.json.gz” | 
unpigz -c  | 
jq --stream $JQ_QUERY | 
python3 scripts/post_process.py "output.csv"


OĂč



JQ_QUERY = 'select((.[0][1] == "sitelinks" and (.[0][2]=="enwiki" or .[0][2] =="ruwiki") and .[0][3] =="title") or .[0][1] == "id")' 


C'était, en fait, tout le pipeline qui a créé le mappage nécessaire, comme nous le voyons tout, cela fonctionnait en mode flux:



  • pv filepath - donne une barre de progression basĂ©e sur la taille du fichier et transmet son contenu
  • unpigz -c lit une partie de l'archive et donne jq

  • jq avec la clĂ© - stream a immĂ©diatement produit le rĂ©sultat et l'a passĂ© au postprocesseur (comme avec le tout premier exemple) en Python
  • en interne, le post-processeur est une simple machine Ă  Ă©tats qui a formatĂ© la sortie 


Au total, un pipeline complexe fonctionnant en mode flux sur du big data (0,5 To), sans ressources importantes et constitué d'un simple pipeline et de quelques outils.

Un autre conseil important: soyez bon et efficace dans le terminal et Ă©crivez dans bash / zsh / etc.
OĂč est-ce utile? Oui, presque partout - il y a, encore une fois, BEAUCOUP de matĂ©riel Ă  Ă©tudier sur le net. En particulier, c'est mon article prĂ©cĂ©dent.



Script R



Encore une fois, le lecteur peut s'exclamer - eh bien, c'est tout un langage de programmation! Et bien sĂ»r, il aura raison. Cependant, je devais gĂ©nĂ©ralement traiter R dans un contexte tel qu'en fait, il Ă©tait trĂšs similaire au langage de requĂȘte.



R est un cadre de calcul statistique et un langage de calcul et de visualisation statique (selon cela ).





Pris d'ici . Au fait, je recommande, du bon matériel.



Pourquoi sortir avec un scientifique pour connaßtre R? Du moins, parce qu'il y a une énorme couche de non-informaticiens qui sont engagés dans l'analyse de données dans R. Je me suis rencontré aux endroits suivants:



  • Secteur pharmaceutique.
  • Biologistes.
  • Secteur financier.
  • Les gens avec une Ă©ducation purement mathĂ©matique, traitant des statistiques.
  • ModĂšles statistiques et d'apprentissage automatique spĂ©cialisĂ©s (qui ne se trouvent souvent que dans la version amont en tant que package R).


Pourquoi est-ce en fait un langage de requĂȘte? Dans la forme dans laquelle il se trouve souvent, il s'agit en fait d'une demande de crĂ©ation d'un modĂšle, comprenant la lecture de donnĂ©es et la correction des paramĂštres de requĂȘte (modĂšle), ainsi que la visualisation de donnĂ©es dans des packages tels que ggplot2 - c'est aussi une forme d'Ă©criture de requĂȘtes.



Exemples de requĂȘtes pour le rendu



ggplot(data = beav, 
       aes(x = id, y = temp, 
           group = activ, color = activ)) +
  geom_line() + 
  geom_point() +
  scale_color_manual(values = c("red", "blue"))


En général, de nombreuses idées de R ont migré vers des packages python tels que pandas, numpy ou scipy, comme les dataframes et la vectorisation des données - par conséquent, en général, beaucoup de choses dans R vous sembleront familiÚres et pratiques.



Il existe de nombreuses sources pour Ă©tudier, par exemple celle-ci .



Graphique de connaissances



Ici, j'ai une expĂ©rience un peu inhabituelle, car je dois encore assez souvent travailler avec des graphiques de connaissances et des langages de requĂȘte pour les graphiques. Par consĂ©quent, passons briĂšvement en revue les bases, car cette partie est un peu plus exotique.



Dans les bases de donnĂ©es relationnelles classiques, nous avons un schĂ©ma fixe - ici, le schĂ©ma est flexible, chaque prĂ©dicat est en fait une «colonne» et mĂȘme plus.



Imaginez que vous modélisiez une personne et que vous souhaitiez décrire des choses clés, par exemple, prenons une personne spécifique de Douglas Adams, nous prendrons cette description comme base.





www.wikidata.org/wiki/Q42



Si nous utilisions une base de données relationnelle, nous aurions à créer une ou plusieurs tables énormes avec un grand nombre de colonnes, dont la plupart seraient NULL ou remplies avec une valeur False par défaut, par exemple, peu probable beaucoup d'entre nous ont une entrée dans la bibliothÚque nationale coréenne - bien sûr, nous pourrions les mettre dans des tableaux séparés, mais ce serait finalement une tentative de modéliser une logique flexible avec des prédicats en utilisant une relation relationnelle fixe.





Par conséquent, imaginez que toutes les données sont stockées sous forme de graphique ou d'expressions logiques binaires et unaires.



OĂč pouvez-vous mĂȘme rencontrer cela? Tout d'abord, travailler avec des donnĂ©es wiki et avec toutes les bases de donnĂ©es graphiques ou donnĂ©es connectĂ©es.



Voici les principaux langages de requĂȘte que j'ai utilisĂ©s et avec lesquels j'ai travaillĂ©.



SPARQL



Wiki:

SPARQL ( . SPARQL Protocol and RDF Query Language) — , RDF, . SPARQL W3C .




Mais en rĂ©alitĂ© c'est un langage de requĂȘtes aux prĂ©dicats logiques unaires et binaires. Vous indiquez simplement conditionnellement ce qui est fixĂ© dans une expression boolĂ©enne et ce qui ne l'est pas (trĂšs simpliste).



La base RDF (Resource Description Framework) elle-mĂȘme, sur laquelle les requĂȘtes SPARQL sont exĂ©cutĂ©es, est un triplet object, predicate, subject- et la requĂȘte sĂ©lectionne les triplets nĂ©cessaires en fonction des contraintes spĂ©cifiĂ©es dans l'esprit de: trouver un X tel que p_55 (X, q_33) soit vrai - oĂč, bien sĂ»r, p_55 est ce -cette relation avec l'ID 55 et q_33 est un objet avec l'ID 33 (c'est toute l'histoire, en omettant Ă  nouveau toutes sortes de dĂ©tails).



Exemple de présentation des données:





Des photos et un exemple avec les pays sont d'ici .



Exemple de requĂȘte de base







En fait, nous voulons trouver la valeur de la variable? Country, telle que pour le prédicat

member_of, il est vrai que member_of (? Country, q458) et q458 est l'ID de l'Union européenne.



Un exemple d'une vraie requĂȘte SPARQL dans le moteur python:







En rĂšgle gĂ©nĂ©rale, je devais lire SPARQL, pas Ă©crire - dans une telle situation, ce sera trĂšs probablement une compĂ©tence utile pour comprendre la langue au moins Ă  un niveau de base afin de comprendre exactement comment les donnĂ©es sont rĂ©cupĂ©rĂ©es. 



Il y a beaucoup de matĂ©riel d'Ă©tude en ligne, comme celui-ci et celui-ci . Je cherche moi-mĂȘme gĂ©nĂ©ralement des constructions et des exemples spĂ©cifiques sur Google, et jusqu'Ă  prĂ©sent, j'en ai assez.



Langages de requĂȘte logique



Vous pouvez en savoir plus sur le sujet dans mon article ici . Ici, nous allons simplement expliquer briĂšvement pourquoi les langages logiques sont bien adaptĂ©s Ă  l'Ă©criture de requĂȘtes. En fait, RDF est juste un ensemble d'instructions logiques de la forme p (X) et h (X, Y), et une requĂȘte logique ressemble Ă  ceci:



output(X) :- country(X), member_of(X,“EU”).



Ici, nous parlons de créer une nouvelle sortie de prédicat / 1 (/ 1 signifie unaire), lorsque à condition qu'il soit vrai pour X ce pays (X) - c'est-à-dire que X est le pays et aussi membre_de (X, «UE»).



Autrement dit, nous avons Ă  la fois les donnĂ©es et les rĂšgles dans ce cas sont gĂ©nĂ©ralement prĂ©sentĂ©es de la mĂȘme maniĂšre, ce qui rend trĂšs facile et efficace la modĂ©lisation des tĂąches.



OĂč vous ĂȘtes-vous rencontrĂ©s dans l'industrie: tout un grand projet avec une entreprise qui Ă©crit des requĂȘtes dans un tel langage, ainsi que sur le projet en cours au cƓur du systĂšme - il semblerait que ce soit une chose plutĂŽt exotique, mais parfois cela se produit.



Un exemple d'extrait de code dans des wikidata de traitement de langage logique:










All Articles