Platforme de date pentru clienți

Sintaxa pipe a BigQuery: SQL mai ușor, mai rapid și mai ușor de citit

Oricine a lucrat cu SQL cunoaște relația de iubire-ură care vine odată cu aceasta. SQL este puternic, standardizat și expresiv - dar este și unul dintre cele mai neintuitive limbaje de citit și întreținut la scară largă. Cu cât interogarea devine mai profundă, cu atât devine mai greu de înțeles ce se întâmplă de fapt și în ce ordine.

Asta pentru că SQL nu curge în ordinea în care crezi. Începi prin a scrie SELECT, dar baza de date nu procesează de fapt acest lucru mai întâi. Motorul începe cu FROM clauză, apoi unește datele, le filtrează, le agregă și abia ulterior aplică sortarea și proiecția. Rezultatul este o interogare care este scrisă înapoi raport cu modul în care este executat.

Această neconcordanță între sintaxă și execuție face ca SQL să fie atât dificil din punct de vedere cognitiv, cât și costisitor din punct de vedere computațional. Analiștii se bazează adesea pe subinterogări sau expresii comune de tabel (CTE-uri) pentru a simula un flux de sus în jos, adăugând complexitate și redundanță inutile. Chiar și utilizatorii experimentați ajung să depaneze blocuri logice imbricate în loc să se concentreze asupra problemei pe care o rezolvă.

Pentru a aborda acest lucru, Bigquery. Codurile supports1 se execută în aceeași ordine în care sunt citite. În loc să scrieți logica pe dos, aceasta se scrie pas cu pas, ca o conductă de date - fiecare linie reprezentând o transformare distinctă. Rezultatul este un SQL mai ușor de înțeles, mai ușor de depanat și mult mai intuitiv pentru analiza modernă a datelor.

sintaxa 1 a pipe-ului Google
Sursa: Google

Imaginea de mai sus ilustrează problema principală pe care o rezolvă sintaxa pipe. În SQL tradițional, ordine sintactică (modul în care scrieți o interogare) este nealiniat cu ordine semantică (cum îl procesează baza de date). De exemplu, SELECT apare în partea de sus, dar motorul nu îl evaluează decât după ce se efectuează unirea, filtrarea, gruparea și sortarea.

Această secvență reprezintă fluxul logic și sintactic al unei interogări pipe BigQuery — de sus în jos, de la stânga la dreapta — oglindind modul în care baza de date procesează efectiv datele.

  • DIN: Punctul de plecare al oricărei interogări de tip pipe. Definește tabelul sau subinterogarea inițială din care curg datele. În sintaxa pipe, FROM poate funcționa singură ca o interogare validă și acționează ca intrare într-o conductă secvențială.
  • A TE ALATURA: Extinde tabelul curent cu coloane și rânduri suplimentare dintr-un alt tabel sau subinterogare. Poate fi utilizat de mai multe ori în secvență (|> JOIN table USING (key)), făcând arborii de joncțiune la stânga lizibili fără subinterogări imbricate.
  • A STABILIT: Actualizează valorile existente ale coloanelor (|> SET column = expression). Funcții precum SELECT * REPLACE(...) în SQL standard, dar este mai lizibil și modular atunci când este utilizat ca pas într-o pipeline.
  • EXTINDE: Adaugă coloane calculate la setul de date existent (|> EXTEND expression AS new_column). Similar cu SELECT *, new_column în SQL standard, dar permite crearea incrementală de câmpuri derivate între alte operații, cum ar fi joncțiuni și filtre.
  • CĂDERE BRUSCA: Elimină una sau mai multe coloane din setul de date curent (|> DROP column_name). Echivalent cu SELECT * EXCEPT(column) în SQL standard și este adesea folosit pentru a simplifica ieșirea sau a reduce dimensiunea intermediară a datelor.
  • UNDE: Filtrează rândurile care îndeplinesc o condiție (|> WHERE condition). Poate apărea oriunde în pipeline, înainte sau după agregare, eliminând necesitatea unor cuvinte cheie diferite, cum ar fi HAVING sau QUALIFY.
  • AGREGAT: Efectuează agregări la nivel de tabel sau grupate (|> AGGREGATE SUM(column) AS total GROUP BY categoryÎnlocuiește funcțiile GROUP BY și agregate din cadrul SELECT, simplificând sintaxa și aliniind-o la ordinea logică a operațiilor.
  • COMANDA PENTRU: Sortează rândurile în ordine crescătoare sau descrescătoare (|> ORDER BY column DESC). Produce un tabel de rezultate ordonate care poate fi urmat de operatori precum LIMIT.
  • LIMITĂ: Restricționează numărul de rânduri din rezultat (|> LIMIT 10). Funcționează după ORDER BY sau pe tabele neordonate, păstrând secvența naturală a filtrelor și agregărilor.
  • APEL: Execută o funcție cu valori tabelare sau un model de învățare automată utilizând tabelul curent ca intrare (|> CALL ML.PREDICT(MODEL project.model_name)Elimină necesitatea apelurilor de funcții imbricate, creând un flux de lucru liniar și ușor de citit.
  • SELECTAȚI: Definește proiecția finală a coloanelor care vor fi incluse în rezultat (|> SELECT column1, column2). Servește ca operațiune de închidere într-o conductă, similară cu operațiunea finală SELECT într-o interogare SQL standard.

Mai jos sunt prezentate cele mai frecvente scenarii în care sintaxa pipe simplifică logica SQL, făcând interogările mai curate și mai rapide de utilizat.

Agregarea datelor fără subinterogări

Agregările sunt punctul în care SQL începe să pară denaturat. Dacă vrei să numeri ceva, apoi să numeri acele numărători, te afli dintr-o dată în iadul parantezelor.

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;

Sintaxa pipe-urilor

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;

Gata cu imbricarea sau gruparea dublă. Fiecare pas curge logic și poate fi modificat independent, fără a rescrie întreaga interogare.

Curățarea și transformarea coloanelor pas cu pas

Când trebuie să scrieți text cu litere mici, să calculați totaluri și să eliminați coloane suplimentare, SQL standard vă obligă să rescrieți mai multe SELECT instrucțiuni. Sintaxa pipe introduce SET, EXTEND și DROP operatori, astfel încât să puteți aplica modificările în secvență.

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;

Sintaxa pipe-urilor

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

Fiecare operație se bazează pe cea anterioară, facilitând urmărirea transformărilor și reutilizarea logicii.

Filtrarea după agregare fără a ține cont de „AVÂND”

Una dintre particularitățile SQL este că sincronizarea filtrelor se schimbă în funcție de clauză. Se folosește WHERE înainte de grupare și HAVING după, dar în realitate, ambele filtrează doar rândurile. Sintaxa pipe vă permite să utilizați WHERE în mod constant, indiferent unde îl plasați.

SQL

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

Sintaxa pipe-urilor

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

Acum poți scrie filtre în aceeași ordine în care le gândești: mai întâi filtrează datele, apoi grupează-le, apoi filtrează din nou în funcție de rezultate.

Depanarea interogărilor fără tabele temporare

În SQL standard, verificarea unui rezultat intermediar necesită fie crearea unui tabel temporar, fie încapsularea codului în mai multe CTE-uri. Cu sintaxa pipe, puteți rula interogarea până în orice punct din pipeline.

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;

Sintaxa pipe-urilor

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

Fiecare prefix al interogării este executabil independent, ceea ce înseamnă că puteți „vedea” datele în orice etapă. Este o modalitate mai curată și mai interactivă de depanare și iterare.

Înlănțuirea modelelor și funcțiilor fără imbricare

Când se lucrează cu funcții cu valori tabelare sau modele BigQuery ML, imbricarea poate deveni rapid ilizibilă. Sintaxa pipe înlocuiește aceste apeluri imbricate cu înlănțuire liniară folosind CALL.

SQL

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

Sintaxa pipe-urilor

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

Dacă aplicați mai multe modele sau transformări, pur și simplu suprapuneți linii CALL suplimentare — nu sunt necesare paranteze.

Pivotarea datelor fără selecții imbricate

Pivotarea datelor a fost întotdeauna un proces anevoios, necesitând adesea straturi de subinterogări. Sintaxa pipe o simplifică într-o secvență fluidă.

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

Sintaxa pipe-urilor

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

Interogarea se citește acum ca o poveste: începe cu datele tale, unește-le, selectează ce ai nevoie, apoi pivotează.

De ce sintaxa pipe-urilor schimbă regulile jocului

Sintaxa pipe nu reinventează SQL - îl clarifică. Păstrează tot ce are de puternic în structura declarativă a SQL, dar elimină costurile cognitive ale scrierii logicii invers.

Pentru specialiștii în date, analiști și ingineri, asta înseamnă:

  • Interogări mai ușor de citit, scris și depanat
  • Gata cu jongleria subinterogărilor sau CTE-urilor pentru sarcini simple
  • Logică simplificată care reflectă modul în care gândești de fapt
  • Performanță mai bună și mai puține operațiuni redundante

Sintaxa pipe a BigQuery este SQL pentru era modernă a datelor - liniară, intuitivă și optimizată pentru analize din lumea reală.

William Karr

Bill este Șeful Departamentului de Date la OpenINSIGHTS și gestionează operațiunile de știință a datelor pentru clienții de retail. Are un doctorat în matematică de la Universitatea din Illinois, Urbana-Champaign, și o certificare de master în științe și inginerie computațională. În timpul... Mai mult »
Înapoi la butonul de sus
Închide

Blocarea reclamelor a fost detectată

Ne bazăm pe reclame și sponsorizări pentru a menține Martech Zone gratuit. Vă rugăm să luați în considerare dezactivarea blocatorului de reclame sau să ne susțineți cu un abonament anual accesibil și fără reclame (10 USD):

Înscrie-te pentru un abonament anual