Bilješke stručnjaka za podatke: personalizirani pregled jezika za upite podataka

Bilješke stručnjaka za podatke: personalizirani pregled jezika za upite podataka
Govorim vam iz osobnog iskustva što je bilo korisno gdje i kada. To je pregled i teza, da bude jasno što i gdje možete dalje kopati - ali ovdje imam isključivo subjektivno osobno iskustvo, možda je kod vas sve sasvim drugačije.

Zašto je važno znati i moći koristiti upitne jezike? Data Science u svojoj srži ima nekoliko važnih faza rada, a prva i najvažnija (bez nje sigurno ništa neće raditi!) je dobivanje ili izdvajanje podataka. Podaci se najčešće nalaze negdje u nekom obliku i potrebno ih je "dohvatiti" od tamo. 

Upitni jezici omogućuju vam izdvajanje ovih podataka! I danas ću vam reći o onim upitnim jezicima koji su mi bili korisni i reći ću vam i pokazati gdje i kako točno - zašto je potrebno učiti.

Postojat će tri glavna bloka vrsta podatkovnih upita o kojima ćemo raspravljati u ovom članku:

  • "Standardni" upitni jezici su ono što se obično podrazumijeva kada se govori o upitnom jeziku, kao što je relacijska algebra ili SQL.
  • Upitni jezici za skriptiranje: na primjer, Python stvari pandas, numpy ili skriptiranje ljuske.
  • Jezici upita za grafikone znanja i baze podataka grafikona.

Sve što je ovdje napisano je samo osobno iskustvo, ono što je bilo korisno, s opisom situacija i "zašto je to trebalo" - svatko može isprobati kako se slične situacije mogu dogoditi i pokušati se unaprijed pripremiti na njih razumijevanjem ovih jezika ​​prije nego što se morate (hitno) prijaviti na projekt ili čak doći do projekta gdje su potrebni.

"Standardni" upitni jezici

Standardni upitni jezici su upravo u onom smislu kako o njima obično razmišljamo kada govorimo o upitima.

Relacijska algebra

Zašto je danas potrebna relacijska algebra? Kako biste dobro razumjeli zašto su upitni jezici strukturirani na određeni način i kako biste ih svjesno koristili, morate razumjeti njihovu srž.

Što je relacijska algebra?

Formalna definicija je sljedeća: relacijska algebra je zatvoreni sustav operacija na relacijama u relacijskom modelu podataka. Malo ljudskije rečeno, ovo je sustav operacija nad tablicama tako da je rezultat uvijek tablica.

Pogledajte sve relacijske operacije u ovo članak s Habra - ovdje opisujemo zašto trebate znati i gdje vam je korisno.

Zašto?

Početak razumijevanja o čemu se radi u upitnim jezicima i koje operacije stoje iza izraza u određenim upitnim jezicima često daje dublje razumijevanje onoga što funkcionira u upitnim jezicima i kako.

Bilješke stručnjaka za podatke: personalizirani pregled jezika za upite podataka
Preuzeto iz ovo članci. Primjer operacije: join, koja spaja tablice.

Materijali za proučavanje:

Dobar uvodni tečaj sa Stanforda. Općenito, ima puno materijala o relacijskoj algebri i teoriji - Coursera, Udacity. Na internetu postoji i ogromna količina materijala, uključujući i dobre akademski tečajevi. Moj osobni savjet: morate jako dobro razumjeti relacijsku algebru - ovo je osnova osnova.

SQL

Bilješke stručnjaka za podatke: personalizirani pregled jezika za upite podataka
Preuzeto iz ovo članak.

SQL je u biti implementacija relacijske algebre - uz važno upozorenje, SQL je deklarativan! Odnosno, kada pišete upit na jeziku relacijske algebre, vi zapravo kažete kako izračunati - ali sa SQL-om specificirate što želite izdvojiti, a onda DBMS već generira (učinkovite) izraze na jeziku relacijske algebre (njihov ekvivalencija nam je poznata kao Coddov teorem).

Bilješke stručnjaka za podatke: personalizirani pregled jezika za upite podataka
Preuzeto iz ovo članak.

Zašto?

Relacijski DBMS-ovi: Oracle, Postgres, SQL Server itd. još uvijek su gotovo posvuda i postoji nevjerojatno velika vjerojatnost da ćete morati komunicirati s njima, što znači da ćete morati ili čitati SQL (što je vrlo vjerojatno) ili ga pisati ( nije ni malo vjerojatno).

Što čitati i proučavati

Prema istim gornjim linkovima (o relacijskoj algebri), postoji nevjerojatna količina materijala, npr. ovo.

Usput, što je NoSQL?

“Vrijedi još jednom naglasiti da pojam “NoSQL” ima apsolutno spontano podrijetlo i iza njega ne stoji općeprihvaćena definicija niti znanstvena institucija.” Odgovara članak na Habru.

Zapravo, ljudi su shvatili da potpuni relacijski model nije potreban za rješavanje mnogih problema, posebno za one gdje je, na primjer, izvedba kritična i gdje dominiraju određeni jednostavni upiti s agregacijom - gdje je kritično brzo izračunati metriku i zapisati ih u baza podataka, a većina značajki je relacijska pokazala se ne samo nepotrebnom, već i štetnom - zašto nešto normalizirati ako će nam pokvariti ono najvažnije (za neki konkretan zadatak) - produktivnost?

Također, često su potrebne fleksibilne sheme umjesto fiksnih matematičkih shema klasičnog relacijskog modela - a to nevjerojatno pojednostavljuje razvoj aplikacija kada je kritično implementirati sustav i brzo početi raditi, obrađujući rezultate - ili sheme i vrste pohranjenih podataka nisu toliko važni.

Na primjer, stvaramo ekspertni sustav i želimo pohraniti informacije o određenoj domeni zajedno s nekim meta informacijama - možda ne znamo sva polja i jednostavno pohranimo JSON za svaki zapis - to nam daje vrlo fleksibilno okruženje za proširenje podataka model i brzo ponavljanje - tako da će u ovom slučaju NoSQL biti još poželjniji i čitljiviji. Primjer unosa (iz jednog od mojih projekata gdje je NoSQL bio upravo tamo gdje je trebao).

{"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}

Možete pročitati više ovdje o NoSQL-u.

Što studirati?

Ovdje, umjesto toga, trebate samo temeljito analizirati svoj zadatak, koja svojstva ima i koji su NoSQL sustavi dostupni koji bi odgovarali ovom opisu - a zatim početi proučavati ovaj sustav.

Skriptni upitni jezici

Na prvi pogled, čini se, kakve veze Python ima s tim općenito - to je programski jezik, a ne o upitima uopće.

Bilješke stručnjaka za podatke: personalizirani pregled jezika za upite podataka

  • Pandas je doslovno švicarski vojni nož Data Science; u njemu se događa ogromna količina transformacije podataka, agregacije itd.
  • Numpy - vektorski izračuni, matrice i linearna algebra tamo.
  • Scipy - ima puno matematike u ovom paketu, posebno statistike.
  • Jupyter lab - mnoge istraživačke analize podataka dobro se uklapaju u prijenosna računala - korisno je znati.
  • Zahtjevi - rad s mrežom.
  • Pyspark je vrlo popularan među podatkovnim inženjerima, najvjerojatnije ćete morati komunicirati s ovim ili Sparkom, jednostavno zbog njihove popularnosti.
  • *Selenium - vrlo koristan za prikupljanje podataka sa stranica i izvora, ponekad jednostavno ne postoji drugi način za dobivanje podataka.

Moj glavni savjet: naučite Python!

pande

Uzmimo sljedeći kod kao primjer:

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'}))

U biti, vidimo da se kod uklapa u klasični SQL obrazac.

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

Ali važan dio je da je ovaj kod dio skripte i cjevovoda; zapravo, mi ugrađujemo upite u Python cjevovod. U ovoj situaciji, upitni jezik dolazi nam iz biblioteka kao što su Pandas ili pySpark.

Općenito, u pySparku vidimo sličnu vrstu transformacije podataka kroz jezik upita u duhu:

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

Gdje i što čitati

O samom Pythonu općenito nije problem pronaći materijale za proučavanje. Postoji ogroman broj tutorijala na internetu pande, pySpark i tečajeve na Iskra (i također sama po sebi DS). Sve u svemu, sadržaj je ovdje izvrstan za guglanje, a ako bih morao odabrati jedan paket na koji bih se usredotočio, to bi bile pande, naravno. Što se tiče kombinacije DS+Python materijala također puno.

Shell kao upitni jezik

Dosta projekata obrade i analize podataka s kojima sam radio zapravo su skripte ljuske koje pozivaju kod u Pythonu, Javi i same naredbe ljuske. Stoga, općenito, možete smatrati cjevovode u bash/zsh/etc nekom vrstom upita visoke razine (možete, naravno, tu unijeti petlje, ali to nije tipično za DS kod u jezicima ljuske), dajmo jednostavan primjer - trebao sam napraviti QID mapiranje wikipodataka i pune veze na ruske i engleske wikije, za to sam napisao jednostavan zahtjev iz naredbi u bashu, a za izlaz sam napisao jednostavnu skriptu u Pythonu, koju sam sastaviti ovako:

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

gdje

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

To je zapravo bio cijeli cjevovod koji je stvorio potrebno mapiranje; kao što vidimo, sve je radilo u stream modu:

  • pv filepath - daje traku napretka na temelju veličine datoteke i prosljeđuje njezin sadržaj dalje
  • unpigz -c pročitao dio arhive i dao ga jq
  • jq s ključem - stream je odmah proizveo rezultat i proslijedio ga postprocesoru (isto kao u prvom primjeru) u Pythonu
  • interno, postprocesor je bio jednostavan stroj koji je formatirao izlaz 

Sve u svemu, složeni cjevovod koji radi u protoku na velikim podacima (0.5TB), bez značajnih resursa i napravljen od jednostavnog cjevovoda i par alata.

Još jedan važan savjet: budite sposobni dobro i učinkovito raditi u terminalu i pisati bash/zsh/itd.

Gdje će biti korisno? Da, gotovo posvuda - opet, na internetu ima PUNO materijala za proučavanje. Konkretno, ovdje ovo moj prethodni članak.

R skriptiranje

Opet, čitatelj može uzviknuti - pa ovo je cijeli programski jezik! I naravno, bit će u pravu. Međutim, obično sam susretao R u takvom kontekstu da je, zapravo, bio vrlo sličan upitnom jeziku.

R je okruženje za statističko računanje i jezik za statičko računanje i vizualizaciju (prema ovo).

Bilješke stručnjaka za podatke: personalizirani pregled jezika za upite podataka
poduzete stoga. Usput, preporučujem, dobar materijal.

Zašto podatkovni znanstvenik treba poznavati R? Barem zato što postoji ogroman sloj ne-IT ljudi koji analiziraju podatke u R. Naišao sam na to na sljedećim mjestima:

  • Farmaceutski sektor.
  • Biolozi.
  • Financijski sektor.
  • Ljudi čisto matematičkog obrazovanja koji se bave statistikom.
  • Specijalizirani statistički modeli i modeli strojnog učenja (koji se često mogu naći samo u autorskoj verziji kao R paket).

Zašto je to zapravo upitni jezik? U obliku u kojem se često nalazi, to je zapravo zahtjev za kreiranje modela, uključujući čitanje podataka i fiksiranje parametara upita (modela), kao i vizualizaciju podataka u paketima kao što je ggplot2 - ovo je također oblik pisanja upita .

Primjeri upita za vizualizaciju

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

Općenito, mnoge su ideje iz R-a migrirale u python pakete kao što su pandas, numpy ili scipy, poput podatkovnih okvira i vektorizacije podataka - tako da će vam općenito puno stvari u R-u izgledati poznato i zgodno.

Postoji mnogo izvora za proučavanje, npr. ovo.

Grafikoni znanja

Ovdje imam pomalo neobično iskustvo, jer dosta često moram raditi s grafovima znanja i upitnim jezicima za grafove. Stoga, idemo ukratko proći kroz osnove, jer je ovaj dio malo egzotičniji.

U klasičnim relacijskim bazama podataka imamo fiksnu shemu, ali ovdje je shema fleksibilna, svaki predikat je zapravo “stupac” i još više.

Zamislite da modelirate osobu i želite opisati ključne stvari, na primjer, uzmimo konkretnu osobu, Douglasa Adamsa, i upotrijebimo ovaj opis kao osnovu.

Bilješke stručnjaka za podatke: personalizirani pregled jezika za upite podataka
www.wikidata.org/wiki/Q42

Ako bismo koristili relacijsku bazu podataka, morali bismo stvoriti ogromnu tablicu ili tablice s ogromnim brojem stupaca, od kojih bi većina bila NULL ili ispunjena nekom zadanom False vrijednošću, na primjer, malo je vjerojatno da mnogi od nas imaju unos u Korejskoj nacionalnoj knjižnici - naravno, mogli bismo ih staviti u zasebne tablice, ali to bi u konačnici bio pokušaj modeliranja fleksibilnog logičkog sklopa s predikatima pomoću fiksnog relacijskog.

Bilješke stručnjaka za podatke: personalizirani pregled jezika za upite podataka
Zamislite da su svi podaci pohranjeni kao grafikon ili kao binarni i unarni Booleovi izrazi.

Gdje to uopće možete sresti? Prvo, rad sa podaci wiki, i sa svim bazama podataka grafova ili povezanim podacima.

Sljedeći su glavni jezici upita koje sam koristio i s kojima sam radio.

SPARQL

Wiki:
SPARQL (rekurzivni akronim iz Eng. SPARQL protokol i RDF jezik upita) - upitni jezik podataka, predstavljen modelom RDFI protokol prenijeti te zahtjeve i odgovoriti na njih. SPARQL je preporuka W3C konzorcij i jedna od tehnologija semantička mreža.

Ali u stvarnosti to je jezik upita za logičke unarne i binarne predikate. Vi jednostavno uvjetno specificirate što je fiksno u Booleovom izrazu, a što nije (vrlo pojednostavljeno).

Sama baza RDF (Resource Description Framework) nad kojom se izvršavaju SPARQL upiti je trostruka object, predicate, subject - i upit odabire potrebne trojke prema navedenim ograničenjima u duhu: pronađite X tako da je p_55(X, q_33) istinito - gdje je, naravno, p_55 neka vrsta relacije s ID-om 55, a q_33 je objekt s ID 33 (ovdje i cijela priča, opet izostavljajući svakakve detalje).

Primjer prikaza podataka:

Bilješke stručnjaka za podatke: personalizirani pregled jezika za upite podataka
Slike i primjer sa zemljama ovdje stoga.

Primjer osnovnog upita

Bilješke stručnjaka za podatke: personalizirani pregled jezika za upite podataka

Zapravo, želimo pronaći vrijednost varijable ?country tako da za predikat
member_of, istina je da je member_of(?country,q458) i q458 ID Europske unije.

Primjer pravog SPARQL upita unutar python motora:

Bilješke stručnjaka za podatke: personalizirani pregled jezika za upite podataka

Obično sam morao čitati SPARQL umjesto da ga pišem - u toj bi situaciji vjerojatno bila korisna vještina razumjeti jezik barem na osnovnoj razini kako bih točno razumio kako se podaci dohvaćaju. 

Postoji mnogo materijala za proučavanje online: na primjer, ovdje ovo и ovo. Obično googlam specifične dizajne i primjere i to je dovoljno za sada.

Logički upitni jezici

Više o ovoj temi možete pročitati u mom članku ovdje. Ovdje ćemo samo ukratko ispitati zašto su logički jezici prikladni za pisanje upita. U biti, RDF je samo skup logičkih iskaza oblika p(X) i h(X,Y), a logički upit ima sljedeći oblik:

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

Ovdje govorimo o stvaranju novog predikata output/1 (/1 znači unarni), pod uvjetom da je za X točno da je država(X) - tj., X je država i također član_of(X,"EU").

Odnosno, u ovom slučaju su i podaci i pravila prikazani na isti način, što nam omogućuje vrlo jednostavno i kvalitetno modeliranje problema.

Gdje ste se upoznali u industriji?: cijeli veliki projekt s tvrtkom koja piše upite na takvom jeziku, kao i na trenutnom projektu u jezgri sustava - čini se da je to prilično egzotična stvar, ali ponekad se dogodi.

Primjer fragmenta koda u logičkom jeziku koji obrađuje wikidata:

Bilješke stručnjaka za podatke: personalizirani pregled jezika za upite podataka

Materijali: Ovdje ću dati nekoliko poveznica na moderni logički programski jezik Answer Set Programming - preporučujem da ga proučite:

Bilješke stručnjaka za podatke: personalizirani pregled jezika za upite podataka

Izvor: www.habr.com

Dodajte komentar