Platforme podataka o kupcima

BigQueryjeva sintaksa cijevi: Činimo SQL lakšim, bržim i čitljivijim

Svako ko je radio sa SQL zna odnos ljubavi i mržnje koji dolazi s tim. SQL je moćan, standardiziran i ekspresivan - ali je također jedan od najneintuitivnijih jezika za čitanje i održavanje u velikim razmjerima. Što je vaš upit dublji, to je teže razumjeti šta se zapravo događa i kojim redoslijedom.

To je zato što SQL ne teče redoslijedom koji mislite. Počinjete pisanjem SELECT, ali baza podataka to zapravo ne obrađuje prvo. Mehanizam počinje sa FROM klauzula, zatim spaja podatke, filtrira ih, agregira ih i tek kasnije primjenjuje sortiranje i projekciju. Rezultat je upit koji je napisan nazad u odnosu na način na koji je izvršen.

Ova neusklađenost između sintakse i izvršenja čini SQL i kognitivno teškim i računski skupim. Analitičari se često oslanjaju na podupite ili Common Table Expressions (CTE-ovi) za simuliranje toka od vrha prema dnu, dodajući nepotrebnu složenost i redundanciju. Čak i iskusni korisnici na kraju otklanjaju greške u ugniježđenim blokovima logike umjesto da se fokusiraju na problem koji rješavaju.

Za rješavanje ovoga, bigquery support1 se izvršavaju istim redoslijedom kojim se čitaju. Umjesto pisanja logike naopačke, pišete je korak po korak, poput podatkovnog cjevovoda - svaka linija predstavlja zasebnu transformaciju. Rezultat je SQL koji je lakši za razumijevanje, lakši za otklanjanje grešaka i daleko intuitivniji za modernu analizu podataka.

sintaksa google pipe-a 1
Izvor: Google

Gornja slika ilustruje ključni problem koji rješava sintaksa cijevi. U tradicionalnom SQL-u, sintaktički red (kako pišete upit) nije usklađeno sa semantički poredak (kako baza podataka to zapravo obrađuje). Na primjer, SELECT pojavljuje se na vrhu, ali ga mehanizam ne procjenjuje dok se ne završi spajanje, filtriranje, grupiranje i sortiranje.

Ovaj niz predstavlja logički i sintaktički tok BigQuery upita - od vrha do dna, s lijeva na desno - odražavajući način na koji baza podataka zapravo obrađuje podatke.

  • OD: Početna tačka bilo kojeg upita putem cijevi. Definiše početnu tabelu ili podupit iz kojeg podaci teku. U sintaksi cijevi, FROM Može samostalno stajati kao validan upit i služiti kao ulaz u sekvencijalni cjevovod.
  • PRIDRUŽITE SE: Proširuje trenutnu tabelu dodatnim kolonama i redovima iz druge tabele ili podupita. Može se koristiti više puta uzastopno (|> JOIN table USING (key)), čineći stabla spajanja s lijeve strane čitljivim bez ugniježđenih podupita.
  • SET: Ažurira postojeće vrijednosti kolona na mjestu (|> SET column = expression). Funkcije poput SELECT * REPLACE(...) u standardnom SQL-u, ali je čitljiviji i modularniji kada se koristi kao korak u protočnom procesu.
  • PRODUŽI: Dodaje izračunate kolone postojećem skupu podataka (|> EXTEND expression AS new_column). Slično kao SELECT *, new_column u standardnom SQL-u, ali omogućava inkrementalno kreiranje izvedenih polja između drugih operacija kao što su spajanja i filteri.
  • DROP: Uklanja jednu ili više kolona iz trenutnog skupa podataka (|> DROP column_name). Ekvivalentno SELECT * EXCEPT(column) u standardnom SQL-u i često se koristi za pojednostavljenje izlaza ili smanjenje veličine međupodataka.
  • GDE: Filtrira redove koji zadovoljavaju uslov (|> WHERE condition). Može se pojaviti bilo gdje u cjevovodu, prije ili poslije agregacije, uklanjajući potrebu za različitim ključnim riječima poput HAVING ili QUALIFY.
  • AGREGAT: Vrši agregacije cijele tabele ili grupisane agregacije (|> AGGREGATE SUM(column) AS total GROUP BY category). Zamjenjuje GROUP BY i agregacijske funkcije unutar SELECT-a, pojednostavljujući sintaksu i usklađujući je s logičkim redoslijedom operacija.
  • POREDAK PO: Sortira redove u rastućem ili silaznom redoslijedu (|> ORDER BY column DESC). Proizvodi uređenu tabelu rezultata koju mogu pratiti operatori poput LIMIT.
  • LIMIT: Ograničava broj redova u rezultatu (|> LIMIT 10). Radi nakon ORDER BY ili na neuređenim tabelama, čuvajući prirodni redoslijed filtera i agregacija.
  • POZIV: Izvršava funkciju koja vraća vrijednosti u tabelu ili model mašinskog učenja koristeći trenutnu tabelu kao ulaz (|> CALL ML.PREDICT(MODEL project.model_name)). Eliminiše potrebu za ugniježđenim pozivima funkcija, stvarajući linearan i čitljiv radni tok.
  • ODABERI: Definira konačnu projekciju kolona koje treba uključiti u izlaz (|> SELECT column1, column2). Služi kao operacija zatvaranja u cjevovodu, slično završnom SELECT u standardnom SQL upitu.

U nastavku su navedeni najčešći scenariji u kojima sintaksa cijevi pojednostavljuje SQL logiku, čineći upite čišćima i bržim za rad.

Agregiranje podataka bez podupita

Agregacije su mjesto gdje SQL počinje djelovati izopačeno. Ako želite nešto prebrojati, prebrojite te brojeve i odjednom ste u paklu sa zagradama.

SQL

SELECT c_count, COUNT(*) AS custdist
FROM (
  SELECT c_custkey, COUNT(o_orderkey) AS c_count
  FROM customer
  JOIN orders ON c_custkey = o_custkey
  WHERE o_comment NOT LIKE '%unusual%packages%'
  GROUP BY c_custkey
)
GROUP BY c_count
ORDER BY custdist DESC;

Sintaksa usmjerne crte

FROM customer
|> JOIN orders ON c_custkey = o_custkey
   AND o_comment NOT LIKE '%unusual%packages%'
|> AGGREGATE COUNT(o_orderkey) AS c_count GROUP BY c_custkey
|> AGGREGATE COUNT(*) AS custdist GROUP BY c_count
|> ORDER BY custdist DESC;

Nema više ugniježđivanja ili dvostrukog grupiranja. Svaki korak teče logično i može se nezavisno mijenjati bez prepisivanja cijelog upita.

Čišćenje i transformiranje kolona korak po korak

Kada trebate pisati tekst malim slovima, izračunati zbirove i izbaciti dodatne kolone, standardni SQL vas prisiljava da prepišete više SELECT naredbe. Sintaksa cijevi uvodi SET, EXTEND, I DROP operatore tako da možete primijeniti promjene u nizu.

SQL

SELECT o_custkey, ROUND(o_totalprice) AS total_price
FROM (
  SELECT
    o_custkey,
    o_totalprice,
    LOWER(o_orderstatus) AS o_orderstatus
  FROM orders
)
WHERE total_price > 1000;

Sintaksa usmjerne crte

FROM orders
|> SET o_orderstatus = LOWER(o_orderstatus)
|> EXTEND ROUND(o_totalprice) AS total_price
|> WHERE total_price > 1000
|> SELECT o_custkey, total_price;

Svaka operacija se nadovezuje na prethodnu, što olakšava praćenje transformacija i ponovnu upotrebu logike.

Filtriranje nakon agregacije bez pamćenja "IMATI"

Jedna od SQL-ovih neobičnosti je da se vrijeme filtera mijenja ovisno o klauzuli. Koristite WHERE prije grupiranja i HAVING nakon, ali u stvarnosti, oba samo filtriraju redove. Sintaksa cijevi vam omogućava korištenje WHERE dosljedno, bez obzira gdje ga postavite.

SQL

SELECT department, COUNT(*) AS emp_count
FROM employees
WHERE active = TRUE
GROUP BY department
HAVING COUNT(*) > 5;

Sintaksa usmjerne crte

FROM employees
|> WHERE active = TRUE
|> AGGREGATE COUNT(*) AS emp_count GROUP BY department
|> WHERE emp_count > 5;

Sada možete pisati filtere istim redoslijedom kojim ste ih i koristili: prvo filtrirajte podatke, zatim ih grupirajte, a zatim ponovo filtrirajte rezultate.

Otklanjanje grešaka u upitima bez privremenih tabela

U standardnom SQL-u, provjera međurezultata zahtijeva ili kreiranje privremene tabele ili omatanje koda u više CTE-ova. Pomoću sintakse pipe-a, upit možete pokrenuti do bilo koje tačke u pipe-u.

SQL

WITH filtered AS (
  SELECT * FROM orders WHERE o_totalprice > 500
),
summed AS (
  SELECT o_custkey, SUM(o_totalprice) AS total
  FROM filtered GROUP BY o_custkey
)
SELECT * FROM summed WHERE total > 10000;

Sintaksa usmjerne crte

FROM orders
|> WHERE o_totalprice > 500
|> AGGREGATE SUM(o_totalprice) AS total GROUP BY o_custkey
|> WHERE total > 10000;

Svaki prefiks upita je izvršni sam za sebe, što znači da možete "pregledati" podatke u bilo kojoj fazi. To je čistiji i interaktivniji način za otklanjanje grešaka i iteraciju.

Ulančavanje modela i funkcija bez ugniježđivanja

Prilikom rada s funkcijama koje se prenose u tablicu ili BigQuery ML modelima, ugniježđivanje može brzo postati nečitljivo. Sintaksa cijevi zamjenjuje te ugniježđene pozive linearnim ulančavanjem pomoću CALL.

SQL

SELECT *
FROM ML.PREDICT(
  MODEL `project.sentiment_model`,
  (SELECT text FROM reviews)
);

Sintaksa usmjerne crte

SELECT text FROM reviews
|> CALL ML.PREDICT(MODEL `project.sentiment_model`);

Ako primijenite više modela ili transformacija, jednostavno složite dodatne CALL linije - zagrade nisu potrebne.

Pivotiranje podataka bez ugniježđenih odabira

Pivotiranje podataka oduvijek je bio zamoran proces, često zahtijevajući slojeve podupita. Sintaksa cijevi pojednostavljuje ga u jedan tekući niz.

SQL

SELECT *
FROM (
  SELECT n_name, c_acctbal, c_mktsegment
  FROM customer JOIN nation USING (n_nationkey)
)
PIVOT(SUM(c_acctbal) FOR n_name IN ('PERU', 'KENYA', 'JAPAN'));

Sintaksa usmjerne crte

FROM customer
|> JOIN nation USING (n_nationkey)
|> SELECT n_name, c_acctbal, c_mktsegment
|> PIVOT(SUM(c_acctbal) FOR n_name IN ('PERU', 'KENYA', 'JAPAN'));

Upit sada izgleda kao priča: počnite sa svojim podacima, spojite ih, odaberite ono što vam je potrebno, a zatim izvršite pivot.

Zašto je sintaksa cijevi revolucionarna

Sintaksa cijevi ne reinventira SQL - ona ga pojašnjava. Čuva sve moćne elemente deklarativne strukture SQL-a, ali uklanja kognitivno opterećenje pisanja logike unatrag.

Za naučnike podataka, analitičare i inženjere, to znači:

  • Lakše čitanje, pisanje i otklanjanje grešaka u upitima
  • Nema više žongliranja podupitima ili CTE-ovima za jednostavne zadatke
  • Pojednostavljena logika koja odražava kako zapravo razmišljate
  • Bolje performanse i manje redundantnih operacija

Sintaksa BigQuery-jevog pipe-a je SQL za modernu eru podataka – linearna, intuitivna i optimizirana za analitiku u stvarnom svijetu.

William Karr

Bill je glavni naučnik za podatke u OpenINSIGHTS-u i upravlja operacijama nauke o podacima za maloprodajne klijente. Ima doktorat iz matematike sa Univerziteta Illinois u Urbana-Champaign-u i magistarski certifikat iz računarske nauke i inženjerstva. Tokom svog... Više »
Nazad na vrh dugmeta
blizu

Adblock otkriven

Oslanjamo se na oglase i sponzorstva da bismo ostali Martech Zone besplatno. Molimo vas da razmislite o onemogućavanju blokatora oglasa ili nas podržite pristupačnom godišnjom članarinom bez oglasa (10 USD):

Prijavite se za godišnje članstvo